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 }
  • 相关阅读:
    Quartz.NET-2.3.3 各种 数据库配置 类别大全
    C#获取当前路径的七种方法 【转载】
    BCB 如何拦截TAB键消息
    用union 和 struct 位域操作
    表值函数
    C#中 委托和事件的关系
    关于C++ Builder Codegurad 问题的排查。
    存储过程中使用事务的“正规”写法
    C++ 中对vector<T*> 数组的查找和排序
    BCB 中 Application->CreateForm 和 New 的一个区别
  • 原文地址:https://www.cnblogs.com/zle1992/p/8997338.html
Copyright © 2011-2022 走看看