Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱
MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina.com

领扣-209 长度最小的子数组 Minimum Size Subarray Sum MD


目录

长度最小的子数组 Minimum Size Subarray Sum -209

问题

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

示例:

输入: s = 7, nums = [2,3,1,2,4,5]
输出: 2
解释: 子数组 [4,5] 是该条件下的长度最小的连续子数组。

进阶:

如果你已经完成了 O(n) 时间复杂度的解法, 请尝试 O(n log n) 时间复杂度的解法。

暴力法

class Solution {
public int minSubArrayLen(int s, int[] nums) {
int len = Integer.MAX_VALUE, tem;
for (int i = 0; i < nums.length; i++) {
tem = 0;
for (int j = i; j < nums.length; j++) {
tem += nums[j];
if (tem >= s) {
len = Math.min(len, j - i + 1);
break;
}
}
}
return len == Integer.MAX_VALUE ? 0 : len;
}
}

时间复杂度:O(n^2)

空间复杂度:O(1)

暴力法稍加改进(然并卵)

class Solution {
public int minSubArrayLen(int s, int[] nums) {
int len = Integer.MAX_VALUE, tem;
for (int i = 0; i < nums.length; i++) {
tem = 0;
for (int j = i; j < nums.length && j < i + len - 1; j++) {
tem += nums[j];
if (tem >= s) {
len = j - i + 1;
break;
}
}
}
return len == Integer.MAX_VALUE ? 0 : len;
}
}

时间复杂度:O(n^2)

空间复杂度:O(1)

双指针法(推荐)

我们需要定义两个指针left和right,分别记录子数组的左右的边界位置,然后我们让right向右移,直到子数组和大于等于给定值或者right达到数组末尾,此时我们更新最短距离,并且将left向右移一位,然后再sum中减去移去的值,然后重复上面的步骤,直到right到达末尾,且left到达临界位置,即要么到达边界,要么再往右移动,和就会小于给定值

class Solution {
public int minSubArrayLen(int s, int[] nums) {
int len = Integer.MAX_VALUE, left = 0, sum = 0;
for (int right = 0; right < nums.length; right++) {
sum += nums[right]; //左指针不动,右指针一直向右移动
while (sum >= s) {
len = Math.min(len, right - left + 1); //当满足条件时先记录一下当前需要的长度
sum -= nums[left++]; //然后左指针向右移动(移动过程中如果满足条件则长度-1),直到不满足条件(继续移动右指针)
}
}
return len == Integer.MAX_VALUE ? 0 : len;
}
}

时间复杂度:O(n)

空间复杂度:O(1)

二分查找法(不懂)

思路是,我们建立一个比原数组长一位的sums数组,其中sums[i]表示nums数组中[0, i - 1]的和,然后我们对于sums中每一个值sums[i],用二分查找法找到子数组的右边界位置,使该子数组之和大于sums[i] + s,然后我们更新最短长度的距离即可。

class Solution {
public int minSubArrayLen(int s, int[] nums) {
int len = nums.length, res = len + 1;
int[] sums = new int[len + 1];
for(int i = 1; i<len+1; i++){
sums[i] = sums[i-1] + nums[i-1];
}
for(int i = 0; i<len+1; i++){
int right = searchRight(i+1, len, sums[i]+s, sums);
if(right == len + 1) break;
if(res > right - i) res = right - i;
}
return res == len + 1?0:res;
} private int searchRight(int left, int right, int key, int sums[]){
while(left <= right){
int mid = (left + right)/2;
if(sums[mid] >= key){
right = mid - 1;
}else{
left = mid + 1;
}
}
return left;
}
}

2016-12-28

2018-12-16

领扣-209 长度最小的子数组 Minimum Size Subarray Sum MD的更多相关文章

  1. LeetCode 209:最小长度的子数组 Minimum Size Subarray Sum

    公众号: 爱写bug(ID:icodebugs) 作者:爱写bug 给定一个含有 n 个正整数的数组和一个正整数 s ,找出该数组中满足其和 ≥ s 的长度最小的连续子数组.如果不存在符合条件的连续子 ...

  2. [Swift]LeetCode209. 长度最小的子数组 | Minimum Size Subarray Sum

    Given an array of n positive integers and a positive integer s, find the minimal length of a contigu ...

  3. 【LeetCode】209. 长度最小的子数组

    209. 长度最小的子数组 知识点:数组:前缀和:二分法:双指针:滑动窗口 题目描述 给定一个含有 n 个正整数的数组和一个正整数 target . 找出该数组中满足其和 ≥ target 的长度最小 ...

  4. Java实现 LeetCode 209 长度最小的子数组

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

  5. Leetcode 209.长度最小的子数组 By Python

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

  6. LeetCode 209. 长度最小的子数组(Minimum Size Subarray Sum)

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

  7. 和大于S的最小子数组 · Minimum Size Subarray Sum

    [抄题]: 给定一个由 n 个正整数组成的数组和一个正整数 s ,请找出该数组中满足其和 ≥ s 的最小长度子数组.如果无解,则返回 -1. 给定数组 [2,3,1,2,4,3] 和 s = 7, 子 ...

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

    2022/09/22 第二天 第一题 这题我就直接平方后排序了,很无脑但很快乐啊(官方题解是双指针 第二题 滑动窗口的问题,本来我也是直接暴力求解发现在leetCode上超时,看了官方题解,也是第一次 ...

  9. LeetCode:长度最小的子数组【209】

    LeetCode:长度最小的子数组[209] 题目描述 给定一个含有 n 个正整数的数组和一个正整数 s ,找出该数组中满足其和 ≥ s 的长度最小的连续子数组.如果不存在符合条件的连续子数组,返回 ...

随机推荐

  1. 使用CSS更改图标的颜色

    我们经常在很多网站上见到更改网站的主题时,图标的颜色也改变了,我们总是觉的这一项功能非常伟大,因为我们知道使用CSS是无法完成更改图片的颜色的.那么,网站上随心所欲的图标颜色是采用N多个图片不断的切换 ...

  2. 程序 查看 jvm版本

    System.getProperty("java.version")返回你所需要的.

  3. linux——(8)数据流重定向、管道命令

    概念一:数据流重定向 数据流分输入流和输出流,还有一个标准错误流,负责管理出错信息,比如一般的命令的输出会输出到屏幕上,我们可以用重定向让他输入到某个文件内. 相关操作: 1,标准输入(stdin): ...

  4. django添加REST_FRAMEWORK 接口浏览

    1.安装rest_framework pip install djangorestframework  2.配置rest_framework ## 将rest_framework加入项目app列表 I ...

  5. [NOI2014]购票 --- 斜率优化 + 树形DP + 数据结构

    [NOI2014]购票 题目描述 今年夏天,NOI在SZ市迎来了她30周岁的生日. 来自全国 n 个城市的OIer们都会从各地出发,到SZ市参加这次盛会. 全国的城市构成了一棵以SZ市为根的有根树,每 ...

  6. [POI2005]A Journey to Mars --- 单调队列

    [POI2005]A Journey to Mars 题目描述: Byteazar 决定去火星参加一个空间站旅行. 火星的所有空间站都位于一个圆上. Byteazar 在其中一个登陆然后变开始饶圈旅行 ...

  7. [BZOJ4539][HNOI2016]树(主席树)

    4539: [Hnoi2016]树 Time Limit: 40 Sec  Memory Limit: 256 MBSubmit: 746  Solved: 292[Submit][Status][D ...

  8. BZOJ1002輪狀病毒 暴搜 + 找規律 + 高精度

    @[暴搜, 找規律, 高精度] Description 轮状病毒有很多变种,所有轮状病毒的变种都是从一个轮状基产生的.一个\(n\)轮状基由圆环上\(n\)个不同的基原子和圆心处一个核原子构成的,2个 ...

  9. [bzoj1015](JSOI2008)星球大战 starwar(离线+并查集)

    Description 很久以前,在一个遥远的星系,一个黑暗的帝国靠着它的超级武 器统治者整个星系.某一天,凭着一个偶然的机遇,一支反抗军摧毁了帝国的超级武器,并攻下了星系中几乎所有的星球.这些星球通 ...

  10. 网络抓包工具wireshark常用封装过滤规则

    过滤器的区别 捕捉过滤器(CaptureFilters):用于决定将什么样的信息记录在捕捉结果中.需要在开始捕捉前设置.显示过滤器(DisplayFilters):在捕捉结果中进行详细查找.他们可以在 ...