长度最小的子数组
创始人
2024-05-15 06:05:20
0

力扣题目

  1. 长度最小的子数组
    给定一个含有 n 个正整数的数组和一个正整数 target 。

找出该数组中满足其和 ≥ target 的长度最小的 连续子数组 [numsl, numsl+1, …, numsr-1, numsr] ,并返回其长度。如果不存在符合条件的子数组,返回 0 。

示例 1:

输入:target = 7, nums = [2,3,1,2,4,3]
输出:2
解释:子数组 [4,3] 是该条件下的长度最小的子数组。
示例 2:

输入:target = 4, nums = [1,4,4]
输出:1
示例 3:

输入:target = 11, nums = [1,1,1,1,1,1,1,1]
输出:0

提示:

1 <= target <= 109
1 <= nums.length <= 105
1 <= nums[i] <= 105

进阶:

如果你已经实现 O(n) 时间复杂度的解法, 请尝试设计一个 O(n log(n)) 时间复杂度的解法。
通过次数471,456提交次数993,416

我只会O(n^2)的算法哈哈哈哈,哎呀赶紧去学滑动窗口去~,我发现前缀和还挺实用。

暴力代码:前缀和数组

class Solution {
public:int minSubArrayLen(int target, vector& nums) {/** 滑动窗口在算法基础课讲过,但是不会啦,那当时没学透,再学即可* 暴力做法:前缀和~*/vector prefix_sum(nums.size(), 0);prefix_sum[0] = nums[0];// 计算前缀和for (int i = 1; i < nums.size(); i ++ ) prefix_sum[i] = prefix_sum[i - 1] + nums[i];// for (int i = 0; i < nums.size(); i ++ )//     cout << "前缀和为:" << prefix_sum[i] << " ";// 枚举长度1、2、3...n的窗口长度,一次次遍历for (int length = 1; length <= nums.size(); length ++ ) {// cout << "####枚举长度为:" << length << endl;for (int i = length - 1; i < nums.size(); i ++ ) {int l = i + 1 - length - 1, sub_sum;  // 左边界,即要减去的这部分的尾巴if (l == -1) sub_sum = 0;   // 要减去的前部分else sub_sum = prefix_sum[l];// 开始判断当前长度是否存在满足 target的连续序列// cout << "####当前长度下的连续和为:" << prefix_sum[i] - sub_sum << endl;if (prefix_sum[i] - sub_sum >= target) return length;}}return 0;}
};

提交:TLE

长度最小的子数组
提交记录
18 / 20 个通过测试用例
状态:超出时间限制
提交时间:几秒前

AC代码,思路来自卡哥(代码提前看了几眼,那代码估计先入为主,代码也来自卡哥),传送门:代码随想录

class Solution {
public:int minSubArrayLen(int target, vector& nums) {/*** 卡哥讲的滑动窗口思想我目前理解就是双指针咯* 本来暴力解法是:for循环枚举起点+for循环枚举终点* 优化成 1个for循环枚举终点即可* 什么情况后移终点? 当区间和不够,那起点呢?区间和太大。*/int minLength = 1e6;    // 题目给定最长就1e5int start_index = 0;long long sum = 0;  // 最大为1e10for (int end_index = 0; end_index < nums.size(); end_index ++ ) {sum += nums[end_index]; // 终点后移一位,区间和就加上一个数while (sum >= target) {minLength = min(minLength, end_index - start_index + 1);  // 更新最短长度// cout << minLength << " 起点,终点为:[" << start_index << "," << end_index << "]" << endl;// 不用再后移终点了,开始后移起点,缩小区间sum -= nums[start_index];   // 减少起点那个数,接下去再判断一次是不是大于target,是则继续缩小start_index ++ ;    // @@@这里格外注意,先减sum,再移动,不然减错数}// 不够,则后移终点,进行end_index ++ }if (minLength == 1e6) minLength = 0;return minLength;   // 如果是无解,那就是返回0,OK的}
};

相关内容

热门资讯

安卓共有多少种系统,究竟有多少... 你有没有想过,安卓这个我们每天不离手的操作系统,竟然有那么多不同的版本呢?没错,安卓系统就像一个大家...
安卓系统怎么播放swf,And... 你有没有遇到过这种情况:手里拿着一部安卓手机,想看一个SWF格式的动画,结果发现怎么也打不开?别急,...
pos机安卓系统跟win系统,... 你有没有想过,那些在我们生活中默默无闻的POS机,竟然也有自己的操作系统呢?没错,就是安卓系统和Wi...
俄罗斯封禁安卓系统,本土化替代... 俄罗斯封禁安卓系统的背后:技术、经济与社会的影响在数字化浪潮席卷全球的今天,智能手机已成为我们生活中...
安卓系统总是弹出权限,安卓系统... 手机里的安卓系统是不是总爱和你玩捉迷藏?每次打开一个应用,它就跳出来问你要不要给它开权限,真是让人又...
安卓系统测血氧,便捷健康生活新... 你知道吗?现在科技的发展真是让人惊叹不已!手机,这个我们日常生活中不可或缺的小玩意儿,竟然也能变身成...
蓝光助手安卓系统的,深度解析与... 你有没有发现,现在手机屏幕越来越大,看视频、刷抖音,简直爽到飞起!但是,你知道吗?长时间盯着屏幕,尤...
安卓系统如何隐藏提示,Andr... 你是不是也和我一样,在使用安卓手机的时候,总是被那些弹出来的提示信息打扰到?别急,今天就来教你怎么巧...
安卓6.0系统如何分区,And... 你有没有想过,你的安卓手机里那些神秘的分区到底是怎么来的?别急,今天就来给你揭秘安卓6.0系统如何分...
安卓系统图片怎么涂鸦,指尖上的... 你有没有想过,在安卓系统的手机上,那些单调的图片也能变得生动有趣呢?没错,就是涂鸦!今天,就让我来带...
安卓系统40g,40GB存储空... 你有没有发现,最近你的安卓手机突然变得有点“胖”了呢?没错,就是那个传说中的40G!别急,别慌,今天...
安卓5.0系统怎么重置,轻松实... 手机用久了是不是感觉卡得要命?别急,今天就来教你怎么给安卓5.0系统来个彻底的重置,让它焕发新生!一...
安卓系统是不是快要,安卓系统即... 你有没有发现,最近安卓系统好像有点儿“不安分”了呢?是不是快要发生什么大事情?咱们一起来探个究竟吧!...
安卓6系统和8系统差别,全面对... 你有没有发现,手机更新换代的速度简直就像坐上了火箭呢?这不,安卓系统也跟着时代的步伐,从6系统一路升...
安卓11系统推荐下载,体验全新... 你有没有发现,最近手机界又掀起了一股热潮?没错,就是安卓11系统!这款全新的操作系统一经推出,就吸引...
原生安卓系统怎样升级,从基础到... 你有没有发现,你的安卓手机用久了,有时候就像老牛拉车一样,慢吞吞的?别急,今天就来给你支个招,让你的...
安卓13系统怎么开发,开发者的... 你有没有听说安卓13系统已经发布了?这可是个大新闻呢!作为一个热衷于手机开发的小伙伴,你是不是也跃跃...
安卓q系统镜像下载,轻松升级体... 你有没有听说安卓Q系统已经发布了?这可是安卓家族里的一大亮点呢!今天,我就要来给你详细介绍一下安卓Q...
安卓系统色彩校正软件,打造个性... 你有没有发现,手机屏幕的色彩有时候会让人感觉不太对劲?有时候,画面看起来有点灰蒙蒙的,有时候又太艳丽...
苹果能否下个安卓系统,开启新篇... 你有没有想过,苹果的iOS系统会不会有一天突然宣布,它要拥抱安卓的大家庭呢?想象iPhone和iPa...