leetcode--209.长度最小的子数组

题目描述

给定一个含有 n 个正整数的数组和一个正整数 target 。

找出该数组中满足其和 ≥ target 的长度最小的 连续子数组 [numsl, numsl+1, …, numsr-1, numsr] ,并返回其长度。如果不存在符合条件的子数组,返回 0 。

示例 1:

输入:target = 7, nums = [2,3,1,2,4,3]
输出:2
解释:子数组 [4,3] 是该条件下的长度最小的子数组。
示例 2:

输入:target = 4, nums = [1,4,4]
输出:1
示例 3:

输入:target = 11, nums = [1,1,1,1,1,1,1,1]
输出:0

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/minimum-size-subarray-sum
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

我的想法

我的想法是一个滑动窗口的一个思想,用两个指针,一个表示开始一个表示结束,首先两个指针初始都为0,sum也是0,然后结束指针移动,使得sum>=target,然后结束指针不动,开始指针动,使得sum

class Solution {
    public int minSubArrayLen(int target, int[] nums) {
        int min = nums.length;
        int i = 0;
        int j = 0;
        int sum = 0;
        while (j < nums.length) {
            if (sum >= target && sum - nums[i] >= target) {
                sum -= nums[i];
                i ++;
            }else if (sum >= target && sum - nums[i] < target) {
                int num = j - i + 1;
                // sum += nums[j];
                if (min > num) {
                    min = num;
                }
                j ++;
                if (j < nums.length) sum += nums[j];
            }else {
                sum += nums[j];
                if (sum < target) {
                    j ++;
                }
            }
        }
        if (sum < target && min == nums.length) min = 0;
        return min;

    }
}

答案代码

class Solution {
    public int minSubArrayLen(int target, int[] nums) {
        int n = nums.length;
        if (n == 0) {
            return 0;
        }
        int ans = Integer.MAX_VALUE;
        int start = 0, end = 0;
        int sum = 0;
        while (end < n) {
            sum += nums[end];
            while (sum >= target) {
                ans = Math.min(ans, end - start + 1);
                sum -= nums[start];
                start++;
            }
            end++;
        }
        return ans == Integer.MAX_VALUE ? 0 : ans;
    }
}

作者:LeetCode-Solution
链接:https://leetcode-cn.com/problems/minimum-size-subarray-sum/solution/chang-du-zui-xiao-de-zi-shu-zu-by-leetcode-solutio/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

同样的思想,但是答案代码量又少,运行时间也少,这就是需要学习的地方。

你可能感兴趣的:(java,leetcode,算法,贪心算法)