| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 数据结构与算法 -> leetcode209-长度最小的子数组(中等难度) -> 正文阅读 |
|
[数据结构与算法]leetcode209-长度最小的子数组(中等难度) |
力扣链接 题目描述给定一个含有 n 个正整数的数组和一个正整数 target 。 找出该数组中满足其和 ≥ target 的长度最小的 连续子数组 [numsl, numsl+1, …, numsr-1, numsr] ,并返回其长度。如果不存在符合条件的子数组,返回 0 。
示例 2:
示例 3:
提示:
进阶: 如果你已经实现 O(n) 时间复杂度的解法, 请尝试设计一个 O(n log(n)) 时间复杂度的解法。 我的解题思路双层循环遍历枚举大于target的最小长度的连续子数组 代码
时间复杂度&空间复杂度时间复杂度: O(n2) 官方解法-前缀和+二分查找方法一的时间复杂度是 O(n^2),因为在确定每个子数组的开始下标后,找到长度最小的子数组需要 O(n)O(n) 的时间。如果使用二分查找,则可以将时间优化到 O(\log n)O(logn)。 为了使用二分查找,需要额外创建一个数组sums 用于存储数组nums 的前缀和,其中sums[i] 表示从 nums[0] 到nums[i?1] 的元素和。得到前缀和之后,对于每个开始下标 i,可通过二分查找得到大于或等于 i 的最小下标bound,使得 sums[bound]?sums[i?1]≥s,并更新子数组的最小长度(此时子数组的长度是 bound?(i?1))。 因为这道题保证了数组中每个元素都为正,所以前缀和一定是递增的,这一点保证了二分的正确性。如果题目没有说明数组中每个元素都为正,这里就不能使用二分来查找这个位置了。 这个解法看了好多遍才看懂 看了官方题解写的代码
时间复杂度O(Nlog(n)): 一层循环O(N),里面套一个二分查找O(log(N)),所以是O(Nlog(N)); 官方解法-滑动窗口在方法一和方法二中,都是每次确定子数组的开始下标,然后得到长度最小的子数组,因此时间复杂度较高。为了降低时间复杂度,可以使用滑动窗口的方法。 定义两个指针start 和end 分别表示子数组(滑动窗口窗口)的开始位置和结束位置,维护变量 sum 存储子数组中的元素和(即从 nums[start] 到 nums[end] 的元素和)。 初始状态下,start 和 end 都指向下标 0,sum 的值为 0。 每一轮迭代,将nums[end] 加到 sum,如果 sum≥s,则更新子数组的最小长度(此时子数组的长度是 end?start+1),然后将 nums[start] 从 sum 中减去并将 start 右移,直到sum<s,在此过程中同样更新子数组的最小长度。在每一轮迭代的最后,将 end 右移。 看了官方题解写的代码
时间复杂度O(N),n是数组的长度,start和end各移动了n次。 |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/26 6:29:26- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |