LeetCode209. 长度最小的子数组
2021-05-02 07:29
标签:nlogn 个数 int start 双指针 += 辅助 for循环 复杂 暴力枚举 暴力枚举所有可能的子数组,也就是枚举子数组的所有开始下标和结束下标,计算子数组的和,如果子数组的和小于等于s,就更新最小长度。 同样是枚举子数组的起始下标,我们考虑优化子数组结束下标的搜索空间,如果能用二分找到(满足子数组的和大于等于s)子数组结束下标的位置,相比于方法一就会更快, 考虑用双指针,两个指针start和end分别表示子数组的开始和结束下标,变量sum表示以start开头,以end结尾的子数组的和。start, end, sum的初始值都为0. LeetCode209. 长度最小的子数组 标签:nlogn 个数 int start 双指针 += 辅助 for循环 复杂 暴力枚举 原文地址:https://www.cnblogs.com/linrj/p/13204659.html方法一
class Solution {
public:
int minSubArrayLen(int s, vector
方法二
二分查找要求数组是单调的,由于题目保证每一个元素都是正的,所以我们考虑用一个sums数组记录前缀和,也就是说,sums[i]表示nums[0] ~ nums[i - 1]的元素总和,
这样,问题就转化为对于每一个起始下标i,通过二分查找寻找一个大于等于i的最小下标bound,使得sums[bound] - sums[i - 1] >= s,sums[bound] - sums[i - 1]就是子数组的和。找到了bound之后,我们就更新子数组的最小长度(此时子数组的长度是bound - (i - 1))。class Solution {
public:
int minSubArrayLen(int s, vector
方法三
先将nums[end]加入sum中,如果sum = s,此时不增加end,而是更新子数组的最小长度(此时长度为end - start + 1),然后不断增加start(并更新子数组的最小长度)直到sum
class Solution {
public:
int minSubArrayLen(int s, vector
复杂度分析