题解 | #牛群保卫战#
牛群保卫战
https://www.nowcoder.com/practice/c836930db162418f87874ac5ba84726b
知识点
双指针
解题思路
首先,我们定义两个指针start和end,分别表示滑动窗口的起始位置和结束位置。我们将start和end都初始化为0,并且将当前窗口的和初始化为0。
然后我们开始遍历数组。对于每一个牛,我们将其加入当前窗口之和,并且将end指针向右移动一位。
如果当前窗口之和大于等于目标战斗力值,我们更新满足条件的最短连续牛群的长度,并尝试将start指针向右移动一位,寻找更短的满足条件的连续牛群。然后继续遍历下一个牛。
如果当前窗口之和小于目标值,我们继续将end指针向右移动一位,扩大窗口。
当遍历完所有的牛后,我们可以得到满足条件的最短连续牛群的长度。如果不存在这样的连续牛群,返回0。
Java题解
import java.util.*; public class Solution { /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param target int整型 * @param nums int整型一维数组 * @return int整型 */ public int findMinSubarrayLength (int target, int[] nums) { // write code here int start = 0; int end = 0; int sum = 0; int ans = Integer.MAX_VALUE; // 满足条件的最短连续牛群的长度 while (end < nums.length) { // 将当前牛的战斗力值加入当前窗口的战斗力之和 sum += nums[end]; // 判断当前窗口是否满足条件 while (sum >= target) { // 更新满足条件的最短连续牛群的长度 ans = Math.min(ans, end - start + 1); // 将start指针向右移动一位,寻找更短的满足条件的连续牛群 sum -= nums[start]; start++; } // 将end指针向右移动一位,扩大窗口 end++; } // 如果不存在满足条件的连续牛群,返回0 if (ans == Integer.MAX_VALUE) { return 0; } return ans; } }