public class Solution {
public int minSubArrayLen(int s, int[] nums) {
if(s < 0 || nums == null || nums.length == 0) return 0;
int size = Integer.MAX_VALUE;
int sum = 0;
int j = 0;
for(int i = 0; i < nums.length; i++){
while(j < nums.length && sum < s){
sum += nums[j++];
}
if(sum >= s) size = Math.min(j - i, size);
sum -= nums[i];
}
if(size == Integer.MAX_VALUE) return 0;
return size;
}
}
这题的做法其实和上一题没啥关系,也不属于这个分类。。不过看在长得非常像的份上就一起写了吧 = =
这题其实是 prefix sum array + two sum,利用前缀和数组实现快速区间和查询,同时 two sum 的方法快速地位 index.
这种 prefix sum 的下标要格外小心,很容易标错。。target value 差也是,写之前多手动过几个 case 保平安。
public class Solution {
public int maxSubArrayLen(int[] nums, int k) {
if(nums == null || nums.length == 0) return 0;
// Key: prefix sum
// Value: index
HashMap<Integer, Integer> map = new HashMap<Integer, Integer>();
map.put(0, 0);
int sum = 0;
int size = 0;
for(int i = 0; i < nums.length; i++){
sum += nums[i];
if(map.containsKey(sum - k)){
size = Math.max(size, i - map.get(sum - k) + 1);
}
if(!map.containsKey(sum)) map.put(sum, i + 1);
}
return size;
}
}
这题其实我几周前做过了,放在这个分类里,用分类模板再重构一次吧。
代码上确实简洁了很多,而且一次 AC.
public class Solution {
public int lengthOfLongestSubstring(String s) {
if(s.length() <= 1) return s.length();
int max = 1;
boolean[] hash = new boolean[256];
int j = 0;
for(int i = 0; i < s.length(); i++){
while(j < s.length()){
if(!hash[s.charAt(j)]){
hash[s.charAt(j++)] = true;
} else {
break;
}
}
max = Math.max(max, j - i);
hash[s.charAt(i)] = false;
}
return max;
}
}