209. Minimum Size Subarray Sum

一、题目

  1、审题

  

  2、分析

    求正整数数组 nums 中连续的元素和大于等于 s 的最少元素的个数。

 

二、解答

  1、思路:

    方法一、

      ①、采用变量 min 记录最少元素数,初始值为 Integer.MAX_VALUE;

      ②、遍历 nums 中元素,若当前元素下标为 i 时;令变量 sum = nums[i];

      ③、再创建一个内循环,从下标 i - 1 往前遍历数组 nums,且 sum 值加上遍历经过的元素,

        当 sum >= s 时,跳出内循环,且判断 min 是否需要更新。当 i == 0 时,sum 依然小于 s,则跳出内循环。

      ④、第一层循环遍历完后,若 min 依然是 Integer.MAX_VALUE 则返回 0, 否则返回 min。

 1     public int minSubArrayLen(int s, int[] nums) {
 2     
 3         int minLen = Integer.MAX_VALUE;
 4         int sum = 0;
 5         for (int i = 0; i < nums.length; i++) {
 6             sum = nums[i];
 7             if(sum >= s)
 8                 return 1;
 9             for (int j = i - 1; j >= 0; j--) {
10                 if((sum += nums[j]) >= s) {
11                     minLen = Math.min(minLen, i - j + 1);
12                     break;
13                 }
14             }
15         }
16         
17         return minLen == Integer.MAX_VALUE ? 0 : minLen;
18     }

 

  方法一、 采用两个指针。

      j 不断向后移动,i 也向后移动,sum 记录数组 nums 从下标 i 到下标 j 之间的元素和,最终返回 sum >= s 时的最小 j - i;

    public int minSubArrayLen2(int s, int[] nums) {
        
        if(nums == null || nums.length == 0)
            return 0;
        
        int i = 0, j = 0, sum = 0, min = Integer.MAX_VALUE;
        
        while(j < nums.length) {
            sum += nums[j++];
            
            while(sum >= s) {
                min = Math.min(min, j - i);
                sum -= nums[i++];
            }
        }
        
        return min == Integer.MAX_VALUE ? 0 : min;
    }

 

posted @ 2018-10-31 10:56  skillking2  阅读(141)  评论(0编辑  收藏  举报