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; } };