【刷题-LeetCode】209. Minimum Size Subarray Sum
2024-10-19 22:37:33
- Minimum Size Subarray Sum
Given an array of n positive integers and a positive integer s, find the minimal length of a contiguous subarray of which the sum ≥ s. If there isn't one, return 0 instead.
Example:
Input: s = 7, nums = [2,3,1,2,4,3]
Output: 2
Explanation: the subarray [4,3] has the minimal length under the problem constraint.
Follow up:
If you have figured out the O(n) solution, try coding another solution of which the time complexity is O(n log n).
解法1 暴力搜索
找出所有的$\sum_{k=i}^j a_k \geq s \(的子串,取长度\)j-i+1$最小的
class Solution {
public:
int minSubArrayLen(int s, vector<int>& nums) {
if(nums.size() == 0)return 0;
int ans = INT_MAX;
for(int i = 0; i < nums.size(); ++i){
int tmp_sum = 0;
for(int j = i; j < nums.size() && j - i <= ans; ++j){
tmp_sum += nums[j];
if(tmp_sum >= s)ans = min(ans, j-i+1);
}
}
return ans == INT_MAX ? 0 : ans;
}
};
Note :
- 在内层循环中,一定要加
j - i <= ans
的判断条件,否则会超时 - 为了避免在内层循环中重复求和,可以先计算nums的前n项和,放到数组sum中
解法2 二分查找。前n项和数组sum一定是单调递增的,原问题可以转换为:
查找\(sum[i] + s\)在sum中第一次出现的位置\((i = 0, 1, 2, ..., nums.size())\),即找\(nums[i] + ... + nums[j] \geq s\)对应的最小长度
直接调用c++ stl中的lower_bound()
函数
class Solution {
public:
int minSubArrayLen(int s, vector<int>& nums) {
if(nums.size() == 0)return 0;
vector<int>sum(nums.size() + 1, 0);
for(int i = 0; i < nums.size(); ++i)sum[i+1] = sum[i]+nums[i];
int ans = INT_MAX;
for(int i = 1; i <= nums.size(); ++i){
int to_find = s + sum[i-1];
auto bound = lower_bound(sum.begin(), sum.end(), to_find);
if(bound != sum.end())ans = min(ans, int(bound - sum.begin()) - i + 1);
}
return ans == INT_MAX ? 0 : ans;
}
};
解法3 one-pass。记录满足\(sum \geq s\)的子串的起始位置,在找到一个符合条件的子串后,不断收缩子串
class Solution {
public:
int minSubArrayLen(int s, vector<int>& nums) {
if(nums.size() == 0)return 0;
int ans = INT_MAX, left = 0, sum = 0;
for(int i = 0; i < nums.size(); ++i){
sum += nums[i];
while(sum >= s){
ans = min(ans, i - left + 1);
sum -= nums[left++];
}
}
return ans == INT_MAX ? 0 : ans;
}
};
最新文章
- HTTPS Web配置举例
- linux 使用 nvidia 的 gpu
- java, listmap2json, fastjson
- spring mvc 工作流程
- 编写可测试的JavaScript代码
- Git-windows安装包
- AVKit &; MediaPlayer简写
- 谷歌浏览器 DEV Tools
- (转)Sencha Touch和jQuery Mobile的比较
- (十)Hibernate 查询方式
- xml增强学习笔记
- 织梦(dedecms)如何清空全部文章和删除后新增文章id号归1的方法
- Canvas的下雪效果
- Python pip 下载速度慢? Windows 设置 国内源,用 阿里云 国内镜像 加速
- oracle 索引移动到不同的分区
- 【kindle笔记】之 《黑客微百科》-2018-6-17
- python中使用OpenCV处理图片
- 164. Maximum Gap (Array; sort)
- 几个免费IP地址查询API接口
- Spring学习总结六——SpringMVC一
热门文章
- CMake判断操作系统和编译器
- 【LeetCode】119. 杨辉三角 II Pascal‘s Triangle II(Python & Java)
- 【LeetCode】999. Available Captures for Rook 解题报告(C++)
- 【LeetCode】826. Most Profit Assigning Work 解题报告(Python)
- 【LeetCode】78. Subsets 解题报告(Python & C++)
- C. Arpa&#39;s loud Owf and Mehrdad&#39;s evil plan
- golang 数组的一些自问自答
- 「算法笔记」BSGS 与 exBSGS
- Java EE数据持久化框架mybatis练习——获取id值为1的角色信息。
- Cube 技术解读 | Cube 小程序技术详解