1. 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;
}
};

最新文章

  1. HTTPS Web配置举例
  2. linux 使用 nvidia 的 gpu
  3. java, listmap2json, fastjson
  4. spring mvc 工作流程
  5. 编写可测试的JavaScript代码
  6. Git-windows安装包
  7. AVKit &amp; MediaPlayer简写
  8. 谷歌浏览器 DEV Tools
  9. (转)Sencha Touch和jQuery Mobile的比较
  10. (十)Hibernate 查询方式
  11. xml增强学习笔记
  12. 织梦(dedecms)如何清空全部文章和删除后新增文章id号归1的方法
  13. Canvas的下雪效果
  14. Python pip 下载速度慢? Windows 设置 国内源,用 阿里云 国内镜像 加速
  15. oracle 索引移动到不同的分区
  16. 【kindle笔记】之 《黑客微百科》-2018-6-17
  17. python中使用OpenCV处理图片
  18. 164. Maximum Gap (Array; sort)
  19. 几个免费IP地址查询API接口
  20. Spring学习总结六——SpringMVC一

热门文章

  1. CMake判断操作系统和编译器
  2. 【LeetCode】119. 杨辉三角 II Pascal‘s Triangle II(Python & Java)
  3. 【LeetCode】999. Available Captures for Rook 解题报告(C++)
  4. 【LeetCode】826. Most Profit Assigning Work 解题报告(Python)
  5. 【LeetCode】78. Subsets 解题报告(Python & C++)
  6. C. Arpa&#39;s loud Owf and Mehrdad&#39;s evil plan
  7. golang 数组的一些自问自答
  8. 「算法笔记」BSGS 与 exBSGS
  9. Java EE数据持久化框架mybatis练习——获取id值为1的角色信息。
  10. Cube 技术解读 | Cube 小程序技术详解