题解 | #牛群保卫战#
牛群保卫战
https://www.nowcoder.com/practice/c836930db162418f87874ac5ba84726b
考察的知识点:双指针、滑动窗口;
解答方法分析:
- 定义两个指针 left 和 right,初始时都指向数组的第一个元素。
- 定义变量 sum 用于记录当前窗口内元素的和,初始化为 0。
- 完成以下操作直到 right 指针遍历完整个数组:将 nums[right] 加入到 sum 中。如果 sum 大于等于 target,则说明当前窗口内的元素和满足条件,计算当前窗口的长度(right - left + 1),并将它与当前最小长度进行比较,更新最小长度。将 left 指针向右移动一位,并将 nums[left] 从 sum 中减去。继续移动 right 指针,重复上述步骤。
- 如果最小长度仍然为初始值,说明没有满足条件的连续牛群,返回 0;否则返回最小长度。
所用编程语言:C++;
完整编程代码:↓
class Solution { public: /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param target int整型 * @param nums int整型vector * @return int整型 */ int findMinSubarrayLength(int target, vector<int>& nums) { int n = nums.size(); int left = 0; int right = 0; int sum = 0; int minLen = INT_MAX; while (right < n) { sum += nums[right]; while (sum >= target) { minLen = min(minLen, right - left + 1); sum -= nums[left]; left++; } right++; } return minLen == INT_MAX ? 0 : minLen; } };