问题描述
给定一个正整数数组和一个正整数,要求找出数组中连续子数组的元素和等于目标元素,返回最小的子数组的元素个数。如果没有满足要求,则返回 0 。题目链接:**点我**
样例输入输出
输入:target = 7, nums = [2,3,1,2,4,3]
输出:2
输入:target = 11, nums = [1,1,1,1,1,1,1,1]
输出:0
问题解法
使用首尾两个指针表示子数组的范围。首先,移动右边指针直到子数组元素和大于等于目标数字,计算此刻的子数组元素个数,然后移动左边的指针,直至子数组元素和小于目标数字。在这个过程中,不断更新最小子数组的元素个数。待遍历结束,判断是否有满足要求的子数组,如果有,则返回计算出来的最小子数组元素个数,如果没有,则返回 0。代码如下
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
| class Solution { public int minSubArrayLen(int target, int[] nums) { int start = 0; int end = start; int sum = 0; int count = Integer.MAX_VALUE; while (end < nums.length) { sum += nums[end]; end++;
while (sum >= target) { count = Math.min(count, end - start); if (count == 1) { return 1; }
sum -= nums[start]; start++; } }
return count == Integer.MAX_VALUE ? 0 : count; } }
|