思路: 这道题我没做出来,这其实是不应该的,其实一看就知道是two pointer。这几天反反复复做了这么多two pointer这题还没做出来是不应该的。主要没做出来的原因就是不知道two pointer怎么定位,以及two pointer怎么根据情况来移动。下面简单说一下这题用two pointer实现的思路,其实这个思路之前就碰到过了。简单来说,这题不是求最短吗,那我们先找到一个符合条件的,然后再一步步缩短(优化)。缩短到不符合条件了,基于此时的two pointer位置,再去寻找最近的能符合条件的,然后再缩短优化,以此类推。这边两个pointer left 和 i(初始化都为0,i用来遍历数组)。left 用在找到一个符合条件的,然后要缩短优化的时候(left++)。i用在去找新的符合条件的时候,一开始的时候i从0开始遍历,找到一个符合条件的,此时固定i,这时开始缩短优化(右移left)。缩短到不符合条件了,这时候我们就要找新的符合条件的,这时候固定left,右移i,寻找新的符合条件的。找到新的了之后再进行和前面一样的操作,缩短优化。以此类推。其实left就相当于subarray的左起点,i就相当于右起点。下面给出代码:
class Solution {
public int minSubArrayLen(int s, int[] nums) {
int sum = 0, res = Integer.MAX_VALUE, left = 0;
for(int i = 0; i < nums.length; i++){
sum += nums[i];
while(sum >= s){
res = Math.min(res, i - left + 1);
sum -= nums[left++];
}
}
return (res != Integer.MAX_VALUE) ? res : 0;
}
}
总结:
- two pointer的变种有很多,要灵活运用,多总结,多归纳。
- 常见时间复杂度排行: