zoukankan      html  css  js  c++  java
  • 209. Minimum Size Subarray Sum(双指针)

    Given an array of n positive integers and a positive integer s, find the minimal length of a contiguous subarray of which the sum ≥ s. If there isn't one, return 0 instead.

    Example: 

    Input: [2,3,1,2,4,3], s = 7
    Output: 2
    Explanation: the subarray [4,3] has the minimal length under the problem constraint.


    s = 7, nums = [2,3,1,2,4,3]
    
    2 3 1 2 4 3
    ^
    l
    r
    上边的窗口内所有数字的和 2 小于 7, r 右移
    
    2 3 1 2 4 3
    ^ ^
    l r
    上边的窗口内所有数字的和 2 + 3 小于 7, r 右移
    
    2 3 1 2 4 3
    ^   ^
    l   r
    上边的窗口内所有数字的和 2 + 3 + 1 小于 7, r 右移
    
    2 3 1 2 4 3
    ^     ^
    l     r
    上边的窗口内所有数字的和 2 + 3 + 1 + 2 大于等于了 7, 记录此时的长度 min = 4, l 右移
    
    2 3 1 2 4 3
      ^   ^
      l   r
    上边的窗口内所有数字的和 3 + 1 + 2  小于 7, r 右移
    
    2 3 1 2 4 3
      ^     ^
      l     r
    上边的窗口内所有数字的和 3 + 1 + 2 + 4 大于等于了 7, 更新此时的长度 min = 4, l 右移
    
    2 3 1 2 4 3
        ^   ^
        l   r
    上边的窗口内所有数字的和 1 + 2 + 4 大于等于了 7, 更新此时的长度 min = 3, l 右移
    
    2 3 1 2 4 3
          ^ ^
          l r
    上边的窗口内所有数字的和 2 + 4 小于 7, r 右移
    
    2 3 1 2 4 3
          ^   ^
          l   r
    上边的窗口内所有数字的和 2 + 4 + 3 大于等于了 7, 更新此时的长度 min = 3, l 右移
    
    2 3 1 2 4 3
            ^ ^
            l r
    上边的窗口内所有数字的和 4 + 3 大于等于了 7, 更新此时的长度 min = 2, l 右移
    
    2 3 1 2 4 3
              ^
              r
              l
    上边的窗口内所有数字的和 3 小于 7, r 右移,结束
    class Solution {
    public:
        int minSubArrayLen(int s, vector<int>& a) {
            int slow = 0;
            int min_res = INT_MAX;
            int n = a.size();
            int sum ;
            
            for (int i = 0; i < n; i++) {
                sum += a[i];
                while(sum >= s) {
                    min_res = std::min(min_res,i+1-slow);
                    sum-=a[slow++];
                }
            }
            return (min_res != INT_MAX) ? min_res : 0;
        }
    };
    

      

     1 class Solution {
     2     public int minSubArrayLen(int target, int[] a) {
     3         if(a.length==0||a.length==1)
     4             return 0;
     5         int i = 0,j = 0,sum =0 ,min = Integer.MAX_VALUE;
     6         while(j<a.length){
     7             sum+=a[j++];
     8             while(sum>=target){
     9                 min = Math.min(min,j-i);
    10                 sum-=a[i++];
    11             }
    12         }
    13         return min==Integer.MAX_VALUE?0:min;
    14     }
    15     
    16 }
  • 相关阅读:
    jq 判断单选是否选中
    C# Split 分隔符为字符串及空格的处理
    MSSQL中的bit类型
    js 判断textarea 不为空
    [转]C#中out 及 ref 区别
    [转]asp.net中时间差的问题
    [转]C# Array 数组 及 一些操作
    Addr、@运算符与Pointer类型
    关于Pascal语言中的分号
    关于以后的文章
  • 原文地址:https://www.cnblogs.com/zle1992/p/8997338.html
Copyright © 2011-2022 走看看