209. 长度最小的子数组
这里的更新结果就题来定
class Solution {
public int minSubArrayLen(int target, int[] nums) {
int sum = 0;
int len = 0;
int f = 0;
for(int left = 0, right = 0; right < nums.length;){
//求和
sum += nums[right];
while(sum >= target){
//len
int t = right - left + 1;
if(f == 0 ){
len = t;
}
if(t < len ){
len = right - left +1;
}
f = 1;
left++;
// if(left >= nums.length){
// break;
// }
sum -= nums[left-1];
}
//if(right < nums.length){
right++;
//}
// if(left == nums.length){
// break;
// }
}
return len;
}
}
我在处理第一次len得到长度时使用的flag,老师用的时最大值,思路可以借鉴
先暴力枚举分析所有情况,做这种题都要这样。根据枚举优化得到滑动窗户做法
3. 无重复字符的最长子串
class Solution {
public int lengthOfLongestSubstring(String s) {
Set<Character> set = new HashSet<Character>();
int n = s.length();
int len = 0;
for(int left = 0, right = 0; right < n;right++){
while(right > 0 && set.contains(s.charAt(right))){
set.remove(s.charAt(left));
left++;
}
set.add(s.charAt(right));
len = Math.max(len, right -left +1);
}
return len;
}
}
什么时候更新len有点难,多想一下过程的思路
这里用数组来当hash,空间复杂度为O(1),但如果new hash 就是O(N)