ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

209. 长度最小的子数组

2021-11-24 15:03:13  阅读:134  来源: 互联网

标签:right target nums 209 min int 数组 长度 left


滑动窗口法

class Solution {
    public int minSubArrayLen(int target, int[] nums) {

        /**
         * 滑动窗口
         * 两个指针同向移动,如果当前窗口内的元素和大于target就记录长度,然后left指针右移缩小查找范围
         * 如果小于target,right指针右移扩大查找范围
         */
        int left = 0;
        int right = 0;
        int min = nums.length;
        boolean flag = true;
        int sum = nums[0];

        while (left <= right){

            if (sum >= target){

                /**
                 * flag标志位用来判断min到底有没有修改过,如果没有的话应该返回0
                 */
                min = Math.min(min, right - left + 1);
                left++;
                sum -= nums[left - 1];
                flag = false;
            }

            /**
             * 如果right已经到达右边界但是和还是小于target,说明已经没有满足的区间了,可以直接结束循环了
             */
            else if (sum < target && right == nums.length - 1){
                break;
            }
            else {

                /**
                 * 如果right已经到达右边界,就不应该再增加了
                 */
                if (right + 1 < nums.length) {

                    right++;
                    sum += nums[right];
                }
            }
        }

        return flag == false ? min : 0;
    }
}

/**
 * 时间复杂度 O(n)
 * 空间复杂度 O(1)
 */

优化1——简化循环的判定、不使用标志位

class Solution {
    public int minSubArrayLen(int target, int[] nums) {

        /**
         * 滑动窗口
         * 两个指针同向移动,如果当前窗口内的元素和大于target就记录长度,然后left指针右移缩小查找范围
         * 如果小于target,right指针右移扩大查找范围
         */
        int left = 0;
        int right = 0;
        int min = nums.length + 1;
        int sum = nums[0];

        /**
         * 如果left > right,说明有一个元素大于target,那就不需要再循环了,因为最小长度就是1
         */
        while (left <= right){

            if (sum >= target){

                min = Math.min(min, right - left + 1);
                sum -= nums[left++];
            }
            else {

                /**
                 * 如果right已经到达右边界,就不应该再增加了
                 */
                if (right + 1 < nums.length) {
                    sum += nums[++right];
                }
                else {

                    /**
                     * 如果right已经到达右边界但和还是小于target,说明已经没有满足的区间了,可以直接结束循环了
                     */
                    break;
                }
            }
        }

        /**
         * 如果min没有变过,应该返回0
         */
        return min == nums.length + 1 ? 0 : min;
    }
}

/**
 * 时间复杂度 O(n)
 * 空间复杂度 O(1)
 */

https://leetcode-cn.com/problems/minimum-size-subarray-sum/

标签:right,target,nums,209,min,int,数组,长度,left
来源: https://www.cnblogs.com/taoyuann/p/15598099.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有