zoukankan      html  css  js  c++  java
  • Leetcode209题长度最小的子数组

    题目

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

    示例

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

    题解

    本题可以采用双指针法进行求解,利用双指针维护一个滑动窗口,当窗口内的子数组和大于s时就向前移动左指针,当小于s时就向前移动右指针。

    class Solution {
        public int minSubArrayLen(int s, int[] nums) {
            /*
            本题利用双指针法维持一个滑动窗口,当窗口内的子数组和大于s时就移动左指针,当小于s时就移动右指针
            
            
            */
            int len = nums.length;
            int sum = 0;
            int left = 0;
            int right = 0;
            int result = nums.length + 1;
            while(right < len){
                while(sum < s && right < len){    //滑动窗口子数组和大于目标值时向右滑动右指针
                    sum += nums[right];
                    right++;
                }
                while(sum >= s){    //滑动窗口子数组和小于等于目标值时,向右滑动左指针,并求解最小长度
                    result = Math.min(result, right - left);
                    sum -= nums[left];
                    left++;
                }
            }
            return result == (nums.length + 1) ? 0 : result;    //对特殊情况进行判断,如果s大于整个数组和就直接返回0
        }
    }
  • 相关阅读:
    如何实现多个异步同步执行?
    Treap学习笔记
    实验
    bzoj2876 [NOI2012]骑行川藏(拉格朗日乘数法)
    [SCOI2007]最大土地面积(旋转卡壳)
    Splay学习笔记
    计算几何学习笔记
    [CQOI2006]凸多边形(半平面交)
    大数的乘法(C++)
    商人过河问题(DFS)
  • 原文地址:https://www.cnblogs.com/jianglinliu/p/11831333.html
Copyright © 2011-2022 走看看