LeetCode 209. 长度最小的子数组(JAVA)

题目

给定一个含有 n 个正整数的数组和一个正整数 s ,找出该数组中满足其和 ≥ s 的长度最小的连续子数组,并返回其长度。如果不存在符合条件的连续子数组,返回 0。

示例: 

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

进阶:

如果你已经完成了O(n) 时间复杂度的解法, 请尝试 O(n log n) 时间复杂度的解法。

解题思路

public int minSubArrayLen(int s, int[] nums) {
        //双浮动指针
        int minRet = Integer.MAX_VALUE;
        if (minRet <= 0){
            return 0;
        }
        int left = 0;
        int right = left;
        int subSumRet = nums[left];
        while (right <= nums.length-1){
//            System.out.println(left + " " + right + " subSum:" + subSumRet);
            //子数组少于目标数
            if (subSumRet<s){
                right++;
                //防止数组越界
                if (right >=nums.length){
                    return 0;
                }
                subSumRet += nums[right];
            }else
            {
                int[] subArr = Arrays.copyOfRange(nums, left, right+1);
                minRet = Math.min(minRet, subArr.length);
//                System.out.println(Arrays.toString(subArr) + " " + minRet);

                int tempSumRet = subSumRet - nums[left];
//                System.out.println("tempSubRet:"+tempSumRet);
                //如果减左没法维持目标数就右增,否则就左减
                if (tempSumRet >=s && subArr.length>1)
                {
                    left++;
                    subSumRet = tempSumRet;
                }
                else
                {
                    right++;
                    //防止数组越界
                    if (right >=nums.length){
                        continue;
                    }
                    subSumRet += nums[right];
                }

            }
        }
        return minRet;
    }
上一篇:LeetCode 面试题 01.06. 字符串压缩


下一篇:Flex 弹性布局备忘录