classSolution { public: intminSubArrayLen(int target, vector<int>& nums){ int num = 0; int n = nums.size(); int ans = n + 1; int left = 0; for(int right = 0; right < nums.size(); ++ right){ num += nums[right]; while(num >= target){ ans = min(ans, right - left + 1); num -= nums[left]; left ++; } } return ans == n + 1 ? 0 : ans; } };
713、乘积小于 K 的子数组
给你一个整数数组 nums 和一个整数 k ,请你返回子数组内所有元素的乘积严格小于 k 的连续子数组的数目。
classSolution { public: intnumSubarrayProductLessThanK(vector<int>& nums, int k){ int ans = 0; int num = 1; int left = 0; if(k <= 1){ return ans; } for(int right = 0; right < nums.size(); ++ right){ num *= nums[right]; while(num >= k){ num /= nums[left]; left ++; } ans += right - left + 1; } return ans; } };
3、 无重复字符的最长子串
给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长度。
滑动窗口
用哈希表记录字符出现次数,枚举右端点,如果出现次数大于1,右移左端点,没有大于1,记录答案
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
classSolution { public: intlengthOfLongestSubstring(string s){ unordered_map<char, int> myMap; int l = 0; int ans = 0; for(int r = 0; r < s.size(); ++ r){ myMap[s[r]] ++; while(myMap[s[r]] > 1){ myMap[s[l]] --; l ++; } ans = max(ans, r - l + 1); } return ans; } };