题解 | #牛群保卫战#
牛群保卫战
https://www.nowcoder.com/practice/c836930db162418f87874ac5ba84726b?tpId=354&tqId=10588485&ru=/exam/oj/ta&qru=/ta/interview-202-top/question-ranking&sourceUrl=%2Fexam%2Foj%2Fta%3FtpId%3D354
import java.util.*;
public class Solution {
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param target int整型
* @param nums int整型一维数组
* @return int整型
*/
public int findMinSubarrayLength (int target, int[] nums) {
// fast快指针每次必+1遍历全部nums数组
int fast = 0;
// 慢指针slow用于在sum>target的情况下进行缩减,缩容
int slow = 0;
// sum用于子数组求和是否大于target
int sum = 0;
// pos用于记录连续牛群的长度,这里赋值给nums.length+1相当于一个Integer.MAXValue,赋值一个较大值
// 而pos最多是什么呢?比如nums.length也就是整个数组的长度刚好满足sum>target的条件
// 利用nums.length+1可以判断pos是否被赋值过,可以看结尾的return 会更好理解 ,如果<nums.length+1说明被赋值过,有更小的连续牛群长度,返回pos,否则返回0表示找不到连续牛群>target的长度
int pos = nums.length + 1;
// fast用于遍历求和
for (; fast < nums.length; fast++) {
// 每次必+nums[fast]
sum += nums[fast];
// 什么时候进行缩容?当然是sum>=target的时候
if (sum >= target) {
// 用while(true)进行持续的缩容
while (true) {
// 判断缩容后是否大于target 如果还大于那么减取nums[slow]然后继续缩容
if (sum - nums[slow] >= target) {
sum = sum - nums[slow];
slow++;
// 如果缩容后不能大于target,直接退出
} else {
break;
}
}
// fast-slow+1就是连续牛群的长度,判断是否小于pos,小于就进行赋值,可以用Math.min替换
if (fast - slow + 1 < pos) {
pos = fast - slow + 1;
}
}
}
// 根据是否被赋值判断有没有满足条件的连续牛群
return (pos< nums.length+1)?pos:0;
}
}
本题知识点分析:
1.滑动窗口
2.双指针
3.数组遍历
4.数学模拟
本题解题思路分析:
1.快指针进行求和
2.慢指针进行缩容
3.求的是连续牛群的长度
本题是双指针和滑动窗口的感觉,还是挺好做的。
本题使用编程语言: Java
如果这篇文章对您有帮助,可以点个赞支持一下,感谢~
高频面试算法题解 文章被收录于专栏
高频面试算法题解,每天一小步,人生一大步,跟着一起刷起来!


