记录一下第二次见到的前缀和算法题:

题目:

本题来自leetcode第209题

思路:

子数组是连续的,所以我们可以通过左右指针来移动,它们之间的区域即为所求区域

  • 先求出原数组的和,和target比较。如果原数组的和小于target,那么直接返回0就可以了。
  • 如果原数组的和大于等于target,就用左右指针+前缀和来解决
    1.开始让右指针移动,sum等于右指针经过的数字之和
    2.当sum大于等于target的时候,更新结果(len)
    3.sum减去左指针所在位置的数字,再次重复2
  • 返回最终结果

代码实现:

class Solution {
    public int minSubArrayLen(int target, int[] nums) {
        int left=0,right=0,sum=0,len=nums.length+1;
        for(;right<nums.length;right++){
            sum+=nums[right];
            while(sum>=target){
                len=Math.min(len,right-left+1);
                sum-=nums[left];
                left++;
            }
        }
        return len==nums.length+1? 0 : len;
    }
}

总结:

好久没写算法题了,感觉到手有些生,立个flag,后面定期写算法题。