携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第26天,点击查看活动详情
概述
数组算是一个并不复杂的数据结构,但就是这个,面试官就能在面试过程中考察出很多东西来。例如经典的排序问题,二分搜索,滑动窗口等等,都是在数组这种最基础等数据结构中处理问题的。
我们做数组类算法问题的时候,常常需要定义一个变量,明确该变量的意义,并不停的维护这个变量,也需要特别注意初始值
和边界
问题。
题目
给定一个含有 n
个正整数的数组和一个正整数 target
。
找出该数组中满足其和 ≥ target
的长度最小的 连续子数组 [numsl, numsl+1, ..., numsr-1, numsr]
,并返回其长度。如果不存在符合条件的子数组,返回 0
。
示例
输入: target = 7, nums = [2,3,1,2,4,3]
输出: 2
解释: 子数组 [4,3] 是该条件下的长度最小的子数组。
输入: target = 4, nums = [1,4,4]
输出: 1
输入: target = 11, nums = [1,1,1,1,1,1,1,1]
输出: 0
提示
1 <= target <= 10^9
1 <= nums.length <= 10^5
1 <= nums[i] <= 10^5
代码实现
双指针
该题可以采用双指针的方式来进行解题,具体步骤如下:
- 定义一个最小值变量;
- 定义两个指针
start, end
分别指向数组头部; - 移动
end
遍历数组,累加元素和; - 判断如果和大于等于目标值,则移动
start
来求得最小的子数组; - 返回结果。
class Solution {
public int minSubArrayLen(int target, int[] nums) {
int minLength = Integer.MAX_VALUE;
int sum = 0;
int start = 0, end = 0;
int n = nums.length;
while (end < n) {
// 累加元素的和
sum += nums[end];
// 如果大于等于目标值,则缩减左边的元素,求得最小
while (sum >= target) {
minLength = Math.min(minLength, end - start + 1);
sum -= nums[start];
start++;
}
end++;
}
return minLength == Integer.MAX_VALUE ? 0 : minLength;
}
}