算法數組系列

最大子數組

1 滑動窗口 方法解法
c++

letcode 3數組

給定一個字符串,請你找出其中不含有重複字符的 最長子串 的長度。3d

示例 1:code

輸入: "abcabcbb"
輸出: 3
解釋: 由於無重複字符的最長子串是 "abc",因此其長度爲 3。blog

遇到沒有重複的字符就日後+1,那新+1的數據怎麼知道與前面的元素是否重複呢?(不能一次次掃 這個子串)這裏能夠設置一個數組 freq[256]的 freq[k]對應一個字符的ASCII值的頻率。若是是0就是沒有重複字符串

代碼:string

class Solution {
public:
    int lengthOfLongestSubstring(string s) {
        int freq[256] = {0}; //256個位置,初始化爲0
        int l = 0, r = -1;
        int res = 0;

        while(l<s.size()){
            
            if(freq[s[r+1]]==0 && r+1 < s.size())
                freq[s[++r]]++;
            else
                freq[s[l++]]--;
            res = max(res,r-l+1);
        }
        return res;
    }
};

letcode 209io

給定一個含有 n 個正整數的數組和一個正整數 s ,找出該數組中知足其和 ≥ s 的長度最小的 連續 子數組,並返回其長度。若是不存在符合條件的子數組,返回 0。class

示例:方法

輸入:s = 7, nums = [2,3,1,2,4,3]
輸出:2
解釋:子數組 [4,3] 是該條件下的長度最小的子數組。

解題思路 採用 滑動窗口的方法

class Solution {
public:
    int minSubArrayLen(int s, vector<int>& nums) {
        int l =0,r = -1;
        int sum = 0;
        int index = nums.size()+1;
        while(l<nums.size()){
            if (r+1<nums.size()&& sum<s){
                sum+=nums[++r];
            }else{
                
            
                sum-=nums[l++];    
            }
            
            if(sum>=s){
                 index = min(index,r-l+1);
            }
            
        }
        if(index == nums.size()+1){
            return 0;
        }
        return index;
    }
};
相關文章
相關標籤/搜索