领扣-209 长度最小的子数组 Minimum Size Subarray Sum MD
| 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的更多相关文章
- LeetCode 209:最小长度的子数组 Minimum Size Subarray Sum
公众号: 爱写bug(ID:icodebugs) 作者:爱写bug 给定一个含有 n 个正整数的数组和一个正整数 s ,找出该数组中满足其和 ≥ s 的长度最小的连续子数组.如果不存在符合条件的连续子 ...
- [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 ...
- 【LeetCode】209. 长度最小的子数组
209. 长度最小的子数组 知识点:数组:前缀和:二分法:双指针:滑动窗口 题目描述 给定一个含有 n 个正整数的数组和一个正整数 target . 找出该数组中满足其和 ≥ target 的长度最小 ...
- Java实现 LeetCode 209 长度最小的子数组
209. 长度最小的子数组 给定一个含有 n 个正整数的数组和一个正整数 s ,找出该数组中满足其和 ≥ s 的长度最小的连续子数组.如果不存在符合条件的连续子数组,返回 0. 示例: 输入: s = ...
- Leetcode 209.长度最小的子数组 By Python
给定一个含有 n 个正整数的数组和一个正整数 s ,找出该数组中满足其和 ≥ s 的长度最小的连续子数组.如果不存在符合条件的连续子数组,返回 0. 示例: 输入: s = 7, nums = [2, ...
- LeetCode 209. 长度最小的子数组(Minimum Size Subarray Sum)
题目描述 给定一个含有 n 个正整数的数组和一个正整数 s ,找出该数组中满足其和 ≥ s 的长度最小的连续子数组.如果不存在符合条件的连续子数组,返回 0. 示例: 输入: s = 7, nums ...
- 和大于S的最小子数组 · Minimum Size Subarray Sum
[抄题]: 给定一个由 n 个正整数组成的数组和一个正整数 s ,请找出该数组中满足其和 ≥ s 的最小长度子数组.如果无解,则返回 -1. 给定数组 [2,3,1,2,4,3] 和 s = 7, 子 ...
- 代码随想录第二天| 977.有序数组的平方 ,209.长度最小的子数组 ,59.螺旋矩阵II
2022/09/22 第二天 第一题 这题我就直接平方后排序了,很无脑但很快乐啊(官方题解是双指针 第二题 滑动窗口的问题,本来我也是直接暴力求解发现在leetCode上超时,看了官方题解,也是第一次 ...
- LeetCode:长度最小的子数组【209】
LeetCode:长度最小的子数组[209] 题目描述 给定一个含有 n 个正整数的数组和一个正整数 s ,找出该数组中满足其和 ≥ s 的长度最小的连续子数组.如果不存在符合条件的连续子数组,返回 ...
随机推荐
- pyqt5之QColorDialog颜色对话框最简单使用
设置窗体背景颜色 QWidget.setStyleSheet('QWidget {background-color:#88ab45}') 颜色对话框取得颜色值是十六进制. col=QCo ...
- spring_150907_sqlmapclientdaosupport_getSqlMapClient
1.新建java工程:spring_150907_sqlmapclientdaosupport_getSqlMapClient,如下图所示: 2.工程里添加spring.hibernate.ibati ...
- 【笔试题】怎样将 GB2312 编码的字符串转换为 ISO-8859-1 编码的字符串?
笔试题 怎样将 GB2312 编码的字符串转换为 ISO-8859-1 编码的字符串? import java.io.UnsupportedEncodingException; public clas ...
- css3实现立方体,并且自转效果
先是HTML 一个父div包含四个绝对定位的div <div class='container container--realistic'> <div class='cube cub ...
- EOJ 3256 拼音魔法
模拟. 有$a$先标$a$,其次是$o$和$e$,$o$和$e$在韵母中不会同时存在.最后是$u$和$i$,这两个字母在韵母中可能同时存在,标在后面的那个.输出那些字符的话直接输出就可以了. 举几个例 ...
- POJ3292 Semi-prime H-numbers [数论,素数筛]
题目传送门 Semi-prime H-numbers Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 10871 Acce ...
- 关于如何在 Unity 的 UI 菜单中默认创建出的控件 Raycast Target 属性默认为 false
关于如何在 Unity 的 UI 菜单中默认创建出的控件 Raycast Target 属性默认为 false 我们在 Unity 中通过 UI 菜单创建的各种控件,比如 Text, Image 等, ...
- 微信小程序开发之路之组件化
类似于页面,自定义组件拥有自己的 wxml 模版和 wxss 样式. 官方链接 组件化,反过来理解,写重复的页面,方法,写第二遍就烦了,抽取出来就是组件化,可以理解为公用的方法 对于通用的数据,最先想 ...
- 导航控制器(UINavigationController)
导航控制器管理一系列显示层次型信息的场景.它创建一个视图管理器"栈",栈底为根视图控制器,用户在场景间切换时,依次将试图控制器压入栈中,且当前场景的试图控制器位于栈顶.要返回上一级 ...
- HDU 3790最短路径问题 [最短路最小花费]
题目链接:[http://acm.hdu.edu.cn/showproblem.php?pid=3790] 最短路径问题 Time Limit: 2000/1000 MS (Java/Others) ...