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

    暴力

    class Solution {
        //前缀和
        public int minSubArrayLen(int s, int[] nums) {
            int n = nums.length;
            int res = n;
            //[i,j)
            int[] preSum = new int[n+1];
            for(int i=1;i<=n;i++){
                preSum[i] = preSum[i-1]+nums[i-1];
            }
            for(int i=0;i<n;i++){
                for(int j=i+1;j<=n;j++){
                    int target = preSum[j] - preSum[i];
                    if(target >= s) res = Math.min(res,j-i);
                }
            }
            return (res == n && preSum[n] < s)? 0 : res;
    
        }
    }
    
    

    双指针(滑动窗口)

    1、想清楚指针移动就好,初始i,j都指向0号元素,之后j不断后移,总和不断增加,直到大于等于s,记录长度j-i

    2、之后l后移,总和减去nums[l]的值再判断是否还大于s,如果还大于重复第2步,否则执行第1步

    class Solution {
        //双指针(滑动窗口)
        public int minSubArrayLen(int s, int[] nums) {
          int n = nums.length;  
          int l= 0, r = 0,sum = 0;
          int minLen = n;
          while(l  <= r && r <= n){
              if(sum >= s){
                  minLen = Math.min(minLen,r-l);
                  sum -= nums[l];
                  l++;
              }else{
                  if(r == n) break;
                  sum += nums[r];
                  r++;
              }  
          }
          return l == 0 ? 0 : minLen;
        }
    }
    
    

  • 相关阅读:
    C#:反射
    静态和非静态类
    数据的存入取出(注册机方式)
    退出unity运行
    网络流基础
    欧拉回路
    博弈论问题
    洛谷P5304 [GXOI/GZOI2019] 旅行者
    [ZJOI2006]物流运输
    POJ3278 Catch that cow
  • 原文地址:https://www.cnblogs.com/cstdio1/p/13956091.html
Copyright © 2011-2022 走看看