1、单调性,向右滑动,如果大等于target,数量记录下来,看看去掉左边是否还满足,如果满足,则left++并更新最小值,如果小于target继续向右滑动
209.长度最小的子数组
class Solution {
public:
int minSubArrayLen(int target, vector<int>& nums) {
int len = nums.size();
int res = len + 1;
int sum = 0;
int left = 0;
for (int right = 0; right < len; right++) {
sum += nums[right];
while (sum - nums[left] >= target) {
sum -= nums[left];
left++;
}
if (sum >= target) {
res = min(right - left + 1, res);
}
}
return res == len +1 ? 0 : res;
}
};
713.乘积小于K的子数组
class Solution {
public:
int numSubarrayProductLessThanK(vector<int>& nums, int k) {
if (k <= 1) return 0;
int ans = 0;
int left = 0;
int n = 1;
for (int right = 0; right < nums.size(); right++) {
n *= nums[right];
while (n >= k) {
n /= nums[left];
left++;
}
ans += right - left + 1;
}
return ans;
}
};
3.无重复字符的最长子串
// 时间复杂度 O(n) ,空间复杂度O(128)
class Solution {
public:
int lengthOfLongestSubstring(string s) {
int ans = 0;
unordered_map<char, int> map;
int left = 0;
for (int right = 0; right < s.size(); right++) {
map[s[right]] += 1;
while (map[s[right]] > 1) {
map[s[left]] -= 1;
left += 1;
}
ans = max(ans, right - left + 1);
}
return ans;
}
};