使用滑动窗口解决数组子数组问题

题目一

给定一个含有 n 个正整数的数组和一个正整数 target 。

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

解:因为一个数组要知道的是他的子数组,所以数据不能改动,是一个死数组,那么此时就可以使用滑动窗口的方法解决这个问题。

我们首先定义一个start 和end指向他的数组首位,然后开始比较,若是首位大于target,那么就直接返回1,若是不大于,进行接下来的操作:

1. 将end向右边移动,计算此时的和,若是大于了目标数,记录此时的最小长度,接着将start向右边移动。然后重复1的操作。

2.若是不大于,就将end接着向右边移动,计算此时的和,若是大于了目标数,与以前的最小长度比较,可以直接使用Math库的min方法,一开始将最小长度ans定义为无限大,然后使用min方法来不断更新最小长度。

进行一二步直到strat==end==n的时候返回最小长度。

直接return ans=Integer.MAX_VALUE ? 0 : ans。就可以得到最终答案

题目二

给定一个正整数数组 nums和整数 k ,请找出该数组内乘积小于 k 的连续的子数组的个数。

示例 1:

输入: nums = [10,5,2,6], k = 100
输出: 8
解释: 8 个乘积小于 100 的子数组分别为: [10], [5], [2], [6], [10,5], [5,2], [2,6], [5,2,6]。
需要注意的是 [10,5,2] 并不是乘积小于100的子数组。

这个问题依旧可以使用滑动窗口的方法来解决

因为是正整数的乘法,所以我们可以得知,当一个数组的[i,j]是确定的时候,i越大,乘积是越小的,j越小,乘积越小。那么当我们确定一个l1的时候,i<l1的时候,乘积大于k,j>l1的时候,乘积大于k。,那么枚举的时候就不需要从0开始了,直接可以从l1开始枚举,知道找到一个l2,使得[l2,j+1]小于k,此时i大于l2的所以子数组的乘积都是小于k的。

这个时候,我们就确定下来了目标数组的个数为j−i+1。

  • 4
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

下水道程序员

你的鼓励将是我奋斗的最大动力。

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值