0
点赞
收藏
分享

微信扫一扫

【大数据学习 | Zookeeper】客户端命令行操作

前行的跋涉者 2024-11-06 阅读 14

题目

给定一个含有 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

思路

用一个for循环来完成两个for循环的工作,滑动窗口思想

Q1:一个for循环中的j应该指向滑动窗口的末端还是滑动窗口的开始位置?

如果指向开始位置,那么找到那个末端就很难,需要他从开端位置全部遍历寻找,如果是末端的话,末端先移动,然后前面的指针在移动就可,所以应该是后端

Q2:循环中应该是for循环还是while循环

如果数组是1111 100,target是100,遍历到最后,sum=104然后前面指针开始缩小范围,缩小一个变成103,继续缩小...所以需要一直进行,if只进行一次,所以需要用while。

代码

class Solution {
    public int minSubArrayLen(int target, int[] nums) {
        int result=Integer.MAX_VALUE;//把他设置成最大值,也就是integer类型的最大值
        int sum=0;
        int i=0;
        for(int j=0;j<nums.length;j++){//这是滑动窗口的末端
            sum+=nums[j];
            while(sum>=target){//如果sum>=target,那么就可以缩小前面的指针,找到最小的子数组
                result=Math.min(result,j-i+1);//这些子数组的集合中找到最小的
                sum-=nums[i];
                i++;//移动前面指针
            }
        }
        return result==Integer.MAX_VALUE ?0:result;
    }
}
举报

相关推荐

0 条评论