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