题解 | #牛群保卫战#

牛群保卫战

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;
    }
}

全部评论

相关推荐

点赞 收藏 评论
分享
牛客网
牛客企业服务