长度最小的子数组 :
链接 :
力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台
思路 :
滑动窗口的思想,取i=j=0,向后遍历j,记录前缀和[l,r]为s,如果s>=target,那么左端点向右移动,直到s<target,维护一个[l,r]的滑动窗口,如此循环;
代码 :
Python :
python
class Solution:
def minSubArrayLen(self, target: int, nums: List[int]) -> int:
n = len(nums)
ans = n+1
l=0
s=0
for r,x in enumerate(nums):
s+=x
while s>=target:
ans = min(ans,r-l+1)
s-=nums[l]
l+=1
return ans if ans <= n else 0
C++
cpp
class Solution {
public:
int minSubArrayLen(int target, vector<int>& nums) {
int n = nums.size();
int i=0,j=0;
long long sum = 0;
int ans = INT_MAX;
while(j<n){
sum += nums[j];
while(sum >= target){
ans = min(ans,j-i+1);
sum -= nums[i++];
}
j++;
}
return ans == INT_MAX ? 0 : ans;
}
};
乘积小于K的子数组
链接 :
力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台
思想 :
滑动窗口,和上一题的思想一模一样;
对于一个区间[l,r],r固定,如果[l,r]的乘积小于k,那么对于整个区域满足乘积小于k的数量就是r-l+1个;
代码 :
python
class Solution:
def numSubarrayProductLessThanK(self, nums: List[int], k: int) -> int:
if k<=1:
return 0
n = len(nums)
ans = 0
l = 0
pf = 1
for r,x in enumerate(nums):
pf *= x
while pf >= k:
pf /= nums[l]
l += 1
ans += r - l + 1
return ans
无重复元素的子串
链接 :
力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台
思路 :
双指针,哈希表
思路和前两题类似;
假设在一个无重复元素的字符串后面加上一个字符,如果出现重复元素,那么一定重复的是新加上的那个字符,那么设置一个hash表来统计次数,然后反复将窗口最前面的元素移出窗口,直到将前面与新加元素相同的元素移出时停止;然后循环更新答案即可;
代码 :
Python
python
class Solution:
def lengthOfLongestSubstring(self, s: str) -> int:
l = 0
cnt = Counter()
ans = 0
for r , c in enumerate(s):
cnt[c]+=1
while cnt[c]>=2:
cnt[s[l]]-=1
l+=1
ans = max(ans,r-l+1)
return ans
C++
cpp
class Solution {
public:
int lengthOfLongestSubstring(string s) {
unordered_map<char,int> hash;
int ans=0;
int n = s.size();
int l=0;
for(int r=0;r<n;r++){
hash[s[r]]++;
while(hash[s[r]] > 1) --hash[s[l++]];
ans = max(ans,r-l+1);
}
return ans;
}
};