题解 | #牛群保卫战#

73 阅读2分钟

描述

在草原上,有 N 只牛保卫着它们的领地。每只牛都有一个非负的战斗力值,组成一个数组。现在,想要找到一个连续的牛群,使得他们的战斗力之和大于等于一个给定的目标战斗力值。请找到这个满足条件的最短连续牛群的长度。如果不存在这样的连续牛群,返回 0。

示例1

输入:7,[2, 3, 1, 2, 4, 3]
返回值:2
说明:子数组 [4, 3] 是满足条件的最短连续牛群。

备注:

target(1 <= target <= 10^9)
nums(1 <= nums.length <= 10^51 <= nums[i] <= 10^5

知识点

双指针

Java题解

public class Solution {
    public int findMinSubarrayLength (int target, int[] nums) {
        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;
    }
}

解题思路

首先,我们定义两个指针start和end,分别表示滑动窗口的起始位置和结束位置。我们将start和end都初始化为0,并且将当前窗口的和初始化为0。

然后我们开始遍历数组。对于每一个牛,我们将其加入当前窗口之和,并且将end指针向右移动一位。

如果当前窗口之和大于等于目标战斗力值,我们更新满足条件的最短连续牛群的长度,并尝试将start指针向右移动一位,寻找更短的满足条件的连续牛群。然后继续遍历下一个牛。

如果当前窗口之和小于目标值,我们继续将end指针向右移动一位,扩大窗口。

当遍历完所有的牛后,我们可以得到满足条件的最短连续牛群的长度。如果不存在这样的连续牛群,返回0。