力扣刷题篇之【每日一题】

✨hello,愿意点进来的小伙伴们,你们好呐!
✨ 系列专栏:【力扣刷题篇】
本篇内容:移动窗口题型讲解
作者简介:一名现大二的三非编程小白

1. 长度最小的子数组

链接: 长度最小的子数组
力扣刷题篇之【每日一题】_第1张图片

这个题我们很容易的想到用暴力求解是可以解出来的,但是就是时间复杂度太高了,可能会超出时间限制,所以我们可以想一种比较合适的解法 – 滑动窗口

我们先定义一个start作为窗口的起始,end作为窗口的末端,刚开始start和end都指向0下标。
定义ans 为一个很大的数,来存储数组元素的个数,sum为0,来存储子数组元素的和。
接下来看图片演示

1.
力扣刷题篇之【每日一题】_第2张图片
2.
力扣刷题篇之【每日一题】_第3张图片
3.

力扣刷题篇之【每日一题】_第4张图片

当子数组满足要求时,就可以将该子数组长度存起来,并将start往前移动一位,来查找下一个子数组。移动到,sum小于目标值即可
4.

力扣刷题篇之【每日一题】_第5张图片

然后以此类推,循环判断下去,最终找到最小的窗户返回。

Java代码如下:

class Solution {
    public int minSubArrayLen(int target, int[] nums) {
        int n = nums.length;
        if (n == 0) {
            return 0;
        }
        int ans = Integer.MAX_VALUE;
        int start  = 0;
        int end = 0;
        int sum = 0;
        while(end < n){
            sum += nums[end];
            while(sum >= target){
                ans = Math.min(ans,end - start + 1);
                sum -= nums[start];
                start++;
            }
            end++;
        }

        return ans == Integer.MAX_VALUE ? 0 : ans;
    }
}

你可能感兴趣的:(力扣刷题篇,leetcode,算法,职场和发展)