长度最小的子数组
创始人
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的}
};

相关内容

热门资讯

安卓系统如何下载teamhub... 你有没有想过,在安卓系统上下载一个叫做Teamhub的应用程序呢?这可是个超级实用的工具,无论是工作...
安卓系统如何看无线密码,安卓系... 你有没有想过,你的安卓手机是怎么看懂无线密码的呢?是不是觉得这背后藏着什么神秘的黑科技?别急,今天就...
pd13安装安卓系统,PD13... 你有没有想过,给你的PD13平板电脑装个全新的安卓系统,让它焕发第二春呢?想象那流畅的操作体验,那丰...
苹果系统怎么比安卓好,五大优势... 你有没有想过,为什么苹果系统那么多人喜欢,而安卓系统虽然普及,但总感觉少了点啥?今天,就让我来给你细...
苏州攻略系统和安卓互通,安卓互... 你打算去苏州游玩一番,是不是已经迫不及待想要探索这座古城的韵味了呢?别急,别急,让我来给你支支招,让...
安卓变苹果系统教程荣耀,安卓变... 你是不是也和我一样,对手机系统转换充满了好奇?想要从安卓跳到苹果的阵营,却又觉得一头雾水?别担心,今...
安卓115系统编写 你有没有听说啊?安卓115系统最近可是火得一塌糊涂!作为一个紧跟科技潮流的数码达人,我怎么能不给你来...
安卓系统内录怎么搞,轻松实现屏... 你有没有想过,在安卓手机上录制屏幕,那可是一项超实用的技能呢!无论是想记录游戏操作,还是制作教程,或...
国服无法进入安卓系统,安卓系统... 最近有没有发现,你的安卓手机上那些心仪的国服游戏突然变得高不可攀了呢?别急,让我来给你揭秘这背后的故...
安卓系统破解wifi密码破解,... 你是不是也和我一样,对破解WiFi密码这个话题充满了好奇?想象当你身处一个陌生的环境,急需上网却苦于...
安卓系统项目发布平台 你知道吗?在科技飞速发展的今天,安卓系统项目发布平台可是个香饽饽呢!它就像一个巨大的舞台,让无数开发...
橘子系统与安卓系统哪个好,性能... 最近是不是也被手机系统的问题给困扰了呢?比如,是选择橘子系统还是安卓系统呢?这两个系统各有千秋,今天...
安卓怎么录制系统声音,安卓系统... 你是不是也和我一样,在使用安卓手机的时候,总想记录下那些美妙的系统声音,比如解锁的“滴”声,或者是收...
安卓系统为什么效率低下,揭秘安... 你有没有发现,安卓手机用久了,速度越来越慢,有时候甚至卡得像蜗牛一样?这可真是让人头疼啊!今天,就让...
平板安卓系统不会更新吗 你有没有遇到过这种情况?你的平板电脑用得正开心,突然发现系统提示有更新,可是一按更新,就仿佛进入了无...
先锋平板能用安卓系统吗,先锋平... 你有没有想过,家里的那款先锋平板电脑,是不是也能装上安卓系统呢?这可是个让人好奇的问题,毕竟安卓系统...
小米系统升级安卓13,解锁智能... 你知道吗?最近小米手机界可是炸开了锅,因为小米系统要升级到安卓13啦!这可不是一个小小的更新,而是一...
大力台灯安卓系统怎么用,享受智... 你有没有发现,家里的台灯突然变得智能起来,是不是有点小激动呢?没错,现在市面上很多台灯都升级成了大力...
安卓显示系统文件夹,探索隐藏的... 你有没有发现,你的安卓手机里藏着一个个神秘的文件夹?它们就像隐藏在数字森林中的小径,引导你探索手机世...
安卓11系统占多少,引领潮流的... 你有没有注意到,最近安卓系统又更新啦!没错,就是那个陪伴我们手机生活的安卓11系统。那么,这个新系统...