1 题目描述

给定一个含有 n 个正整数的数组和一个正整数 s ,找出该数组中满足其和 ≥ s 的长度最小的连续子数组。如果不存在符合条件的连续子数组,返回 0。

示例:

输入: s = 7, nums = [2,3,1,2,4,3]
输出: 2

解释: 子数组 [4,3] 是该条件下的长度最小的连续子数组。
进阶:
如果你已经完成了O(n) 时间复杂度的解法, 请尝试 O(n log n) 时间复杂度的解法。

2 解法

在做862时无意中做出了这个题。它和862的区别是,数组中的数都是正数。
在O(N)时间内计算nums的累积和数组sums,sums[i]=nums[0]+nums[1]+…+nums[i]。
假设当前窗口为k,在O(n)时间内可以计算出所有窗口大小为k的子数组的和,如果最大的比s小,要增大窗口,如果最大的比s大(或相等)就缩小窗口。这样最多lg(n)次循环就可以了。

3 java源码

class Solution {// A的累计和数组,sums[i] = sums(A[0]+A[1]+...+A[i])int[] sums;int K;int[] A;int minWindownSize;/*** 窗口大小固定时,计算每个窗口内所有值的和,返回最大的和* 时间复杂度为O(n)** @param x 窗口大小* @return 最大的窗口内值的和*/private int maxSumOverFixedSizeWindow(int x) {int max = sums[x-1];for (int i = 1; i < sums.length-x+1; i++) {int sum = sums[i+x-1]-sums[i-1];if (sum > max) max = sum;}return max;}/*** 可能的窗口范围在[min, max]之间,确定一个中间的数,然后递归查找* @param min* @param max* @return*/private void find(int min, int max) {if (min > max) return;int x = (max-min)/2+min; // 窗口大小if (minWindownSize > 0 && minWindownSize <= x) return;int maxSum = maxSumOverFixedSizeWindow(x); // 窗口大小为x时,窗口内值的和最大为maxSumif (maxSum < K) { // 扩大窗口,没有找到,扩大窗口,看看能不能找到,可能会一直扩大到窗口为n,find(x+1, max);find(min, x-1);} else { // 缩小窗口 maxSum >= K,找到了,继续寻找有没有更好的,要一直缩小到窗口为1minWindownSize = x;find(min, x-1);}}public int minSubArrayLen(int s, int[] nums) {int n = nums.length;if (n == 0) return 0;sums = new int[n];sums[0] = nums[0];for (int i = 1; i < n; i++) {sums[i] = sums[i-1]+nums[i];}this.K = s;this.A = nums;this.minWindownSize = 0;for (int size = 1; size <= n; size*=2) {int maxSum = maxSumOverFixedSizeWindow(size);if (maxSum >= K) {minWindownSize = size;}}if (minWindownSize != 0) {find(1, minWindownSize);} else {find(1, n);}return this.minWindownSize;}
}

leetcode 209.长度最小的子数组相关推荐

  1. 代码随想录算法训练营第二天 | LeetCode 977.有序数组的平方、​LeetCode 209.长度最小的子数组、LeetCode 59.螺旋矩阵II

    LeetCode 977.有序数组的平方 双指针法:数组其实是有序的, 只不过负数平方之后可能成为最大数了.那么数组平方的最大值就在数组的两端,不是最左边就是最右边,不可能是中间.此时可以考虑双指针法 ...

  2. LeetCode—209. 长度最小的子数组

    209. 长度最小的子数组 题目描述:给定一个含有 n 个正整数的数组和一个正整数 target . 找出该数组中满足其和 ≥ target 的长度最小的 连续子数组 [numsl, numsl+1, ...

  3. leetcode —— 209. 长度最小的子数组

    给定一个含有 n 个正整数的数组和一个正整数 s ,找出该数组中满足其和 ≥ s 的长度最小的连续子数组,并返回其长度.如果不存在符合条件的连续子数组,返回 0. 示例: 输入: s = 7, num ...

  4. LeetCode——209.长度最小的子数组

    https://leetcode-cn.com/problems/minimum-size-subarray-sum/submissions/ @代码随想录 1.暴力解法 class Solution ...

  5. LeetCode 209. 长度最小的子数组

    思路: 评论区的大佬太强了,搬运. len 表示 结果:j表示此片段的最左索引:sum表示片段和 先遍历,逐个递加,直到大于s 时,再去缩短长度. public int minSubArrayLen( ...

  6. [leetcode]209. 长度最小的子数组

    暴力: class Solution {public:int minSubArrayLen(int s, vector<int>& nums) {bool flag = false ...

  7. 【Leetcode数组--子数组--滑动窗口】209. 长度最小的子数组 904. 水果成篮 1004. 最大连续1的个数 III 76. 最小覆盖子串(有数组操作中重要的方法:滑动窗口!!!!)

    文章目录 Leetcode209 1.问题描述 2.解决方案 解法一:两个错误思路的算法 解法二:暴力 解法三:滑动窗口法(O(n)) Leetcode904 1.问题描述 2.解决方案 Leetco ...

  8. Leonard代码随想录算法训练营第二天| 977.有序数组的平方 ,209.长度最小的子数组 ,59.螺旋矩阵II。

    第一章数组 (今日任务) 977.有序数组的平方 ,209.长度最小的子数组 ,59.螺旋矩阵II ,总结 建议大家先独立做题,然后看视频讲解,然后看文章讲解,然后在重新做一遍题,把题目AC,最后整理 ...

  9. 代码随想录算法训练营第二天 | LeetCode977.有序数组的平方 ,209.长度最小的子数组,59.螺旋矩阵II

    代码随想录算法训练营第二天 | LeetCode977.有序数组的平方 ,209.长度最小的子数组,59.螺旋矩阵II 一. LeetCode977.有序数组的平方 1. 题目链接[LeetCode9 ...

最新文章

  1. ubuntu 命令整合1
  2. python结果输出到excel-python实现数据导出到excel的示例--普通格式
  3. visual stdio里面怎么取消空格补全?
  4. 【转】1.9 Asp.Net Core 轻松学-多线程之取消令牌(
  5. 【C++】类的成员初始化表与构造函数内赋值操作
  6. 《Kali+Linux渗透测试的艺术》学习总结之----Kali Linux简介
  7. 光线求交加速算法:边界体积层次结构(Bounding Volume Hierarchies)2-表面积启发式法(The Surface Area Heuristic)
  8. 华硕笔记本r414u怎么安装键盘_华硕笔记本键盘灯怎么开
  9. BUG缺陷管理工具--测试用例执行
  10. div默认外边距是多少_CSS盒模型之内边距、边框、外边距 十九问(持续更新)...
  11. [转]C# 3.0入门系列(二)
  12. java 并行框架_JAVA并行框架学习之ForkJoin
  13. 混合线性模型(linear mixed models)
  14. 鸿蒙智慧屏安装apk,亲测华为智慧屏支持安装以下第三方软件,大家赶紧试试!...
  15. go报错# command-line-arguments undefined: *解决方案
  16. An effective intrusion-resilient mechanism for PLCs against data tampering attacks
  17. 上海满五非唯一,非普通性住房计算
  18. 10-Transformation
  19. 【094】统计大写字母个数
  20. 网络 · IPv4协议

热门文章

  1. php记住用户名功能,php利用cookie实现网页记住用户名和密码的功能
  2. suselinux安装谷歌google浏览器
  3. 二元logit回归分析
  4. 怎么升级计算机内存容量,电脑升级内存该注意哪几个方面?
  5. 重建分区表主键 - Recreate Primary Key on a partition table
  6. oracle 分区表转换,Oracle普通表与分区表转换
  7. 【poi第七节】poi设置excel 设置字体格式,java设置excel设置字体格式
  8. 使用VSTS的Git进行版本控制(二)——提交保存工作
  9. 考研数学05-12年真题总结
  10. vipjr学费大概多少,性价比高不高?资深家长来分享