做题记录 力扣 209. 长度最小的子数组

原题链接

给定一个含有 n 个正整数的数组和一个正整数 target 。
找出该数组中满足其总和大于等于 target 的长度最小的 连续子数组 [numsl, numsl+1, ..., numsr-1, numsr] ,并返回其长度。如果不存在符合条件的子数组,返回 0 。

很简单,用双指针。
主要思路:
最开始都初始化,指向第一个元素。
遵循以下规则:
步骤一:慢指针不动,快指针往后移动,并不断判断是否大于等于 target。如果大于或者等于,进入步骤二,否则判断是否到达数组最后一位。如果到达,直接结束循环。否则,继续步骤一。
步骤二:慢指针++,并减去之前慢指针的值,并判断和是否大于等于 target,如果大于或者等于,重复步骤二,否则进入步骤一。
一直到 慢指针 到达最后一位就行。

这里个人认为最难处理的是边界值,算法的思路还是比较任意理解的。

代码:

class Solution {
    public int minSubArrayLen(int target, int[] nums) {
        int start = 0;
        int last = 0;

        int sum = nums[0];
        int result = Integer.MAX_VALUE;

        while (last < nums.length-1) {
            if (sum < target) {
                if (start == nums.length-1) break;
                else if (start < nums.length-1) {
                    start++;
                    sum += nums[start];
                }
            } else {
                int temp = start- last +1;
                result = result > temp ? temp :result;
                sum -= nums[last];
                last++;
            }
        }

        if (target <= nums[nums.length-1]) {
            result = result > 1 ? 1 :result;
        }

        return result == Integer.MAX_VALUE ? 0 : result;
    }
}
posted @ 2023-10-14 00:09  玲落尘肖  阅读(8)  评论(0编辑  收藏  举报