题解 | #牛群保卫战#

牛群保卫战

https://www.nowcoder.com/practice/c836930db162418f87874ac5ba84726b

考察知识点:数组,窗口移动

题目分析:该题可以通过设置一个左值为 left,右值为right的窗口,并计算窗口的内部的值的总和,之后将大于等于target的值记录下来,并选取最小的那个窗口作为输出。如下代码流程

采用的编程语言: C

完整的编码代码:如下所示

/**
 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
 *
 * 
 * @param target int整型 
 * @param nums int整型一维数组 
 * @param numsLen int nums数组长度
 * @return int整型
 */
int findMinSubarrayLength(int target, int* nums, int numsLen ) {
    int right = 0,  left = 0;
    int min_len = numsLen;
    int tmp_nums = 0, flag  = 0;

    while (right <= numsLen && left <= numsLen) {
        if (tmp_nums < target) {		// tmp_nums变量用于保存窗口内的数据总和,如果窗口的总和小于target的话,窗口的右边往右移动一格,扩展窗口的范围
            tmp_nums += nums[right];
            right++;
        } else {		// 如果窗口的数据总和大于target,那么就尝试缩小窗口的大小,寻找一格满足要求的最最小窗口
            tmp_nums -= nums[left];
            left++;
        }

	  	// 当当前窗口内的数字总和大于等于target的时候,就判断最小长度和当前的窗口的长度,如果窗口长度小于记录的最小长度,就刷新最小长度为当前的窗口长度
        if (tmp_nums >= target && min_len >= (right - left)) {
            min_len =  right - left;
            flag  = 1;		// 如果有记录到窗口内的值有大于target的话,flag置1
        }
    }

    if (flag == 0)		//如果没有找到一个合适的窗口,使窗口的值大于target的情况下,flag为0,最小长度应该也为0
        min_len =  0;

    return min_len;
}

面试高频TOP202解析 文章被收录于专栏

采用Java,C,Python等方法去解答面试高频TOP202题目,

全部评论

相关推荐

点赞 评论 收藏
分享
WillingLing:查看图片
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务