LeetCode 209 长度最小的子数组

题目:

给定一个含有 n 个正整数的数组和一个正整数 target 。找出该数组中满足其和 ≥ target 的长度最小的 连续子数组 [numsl, numsl+1, ..., numsr-1, numsr] ,并返回其长度。如果不存在符合条件的子数组,返回 0 。 

示例:

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


 示例 2: 
 输入:target = 4, nums = [1,4,4]
 输出:1

 示例 3:  
 输入:target = 11, nums = [1,1,1,1,1,1,1,1]
 输出:0

提示:

  1 <= target <= 109 
  1 <= nums.length <= 105 
  1 <= nums[i] <= 105 


过程分析:

题目写的很明白了,既然是子串,那么就采用滑动窗口来解决,找到最小的窗口即可。

代码实现:

暴力破解:

public int minSubArrayLen(int target, int[] nums) {
        int size = 0;
        //暴力解法:滑动窗口,首先设置为1,直到所有
        for (int i = 1; i < nums.length + 1; i ++) {
            if (match(target, nums, i)) {
                return i;
            }
        }
        return size;
    }

    public boolean match(int target, int[] nums, int windowSize) {
        //暴力解法:滑动窗口,首先设置为1,直到所有
        int sum = 0;
        for (int i = 0; i < nums.length + 1 - windowSize; i ++) {
            sum = 0;
            for (int j = i; j < windowSize + i; j ++) {
                sum = sum + nums[j];
            }
            if (sum >= target) {
                return true;
            }
        }
        return false;
    }

执行结果:

 

LeetCode 209 长度最小的子数组_第1张图片

二分法

class Solution {
    public int minSubArrayLen(int target, int[] nums) {
        int low = 1;
        int high = nums.length;
        boolean isMatch = false;
        while(low <= high)
        {
            int middle = (low + high) / 2;
            if(match(target, nums,middle)) {
                isMatch = true;
                if (middle == high) {
                    return high;
                }
                high = middle;
            } else {
                low = middle + 1;
            }
        }
        if (!isMatch) {
            return 0;
        }
        return high;
    }

    public boolean match(int target, int[] nums, int windowSize) {
        //暴力解法:滑动窗口,首先设置为1,直到所有
        int sum = 0;
        for (int i = 0; i < nums.length; i ++) {
            sum = sum + nums[i];
            if (i >= windowSize) {
                sum = sum - nums[i - windowSize];
            }
            if (sum >= target) {
                return true;
            }
        }
        return false;
    }
}

执行结果:

LeetCode 209 长度最小的子数组_第2张图片

 

你可能感兴趣的:(数据结构,leetcode,算法,209,子数组,长度)