LeetCode 209. 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.
For example, given the array [2,3,1,2,4,3] and s = 7,
the subarray [4,3] has the minimal length under the problem constraint.
click to show more practice.
If you have figured out the O(n) solution, try coding another solution of which the time complexity is O(n log n).
题目标签:Array, Two Pointers, Binary Search
题目给了一个数组,和一个 s, 让我们找到一个 最短的连续子数组,它的数组之和大于等于 s。
题目说了两种方法:O(n) 和 O(n log n)
方法1: O(n) 利用 Two Pointers
设一个start 和一个 end,用sliding window, 一个窗口,start 到 end。
当 这个窗口的sum 小于 s 的时候,说明数字还不够大,需要更多数字,就延伸右边的 end 来得到更多数字;
当 这个窗口的sum 大于等于 s 的时候,说明 我们得到了一个 可能是答案的 window size,我们需要最小的。 然后把左边的start 向右延伸,继续寻找新的可能性。
Java Solution:
Runtime beats 24.17%
完成日期:09/04/2017
关键词:Array,Two Pointers
关键点:Sliding window 控制左右边界,来找到最小的符合要求的 window size
class Solution
{
public int minSubArrayLen(int s, int[] nums)
{
/* Solution 1: O(n)*/
if(nums.length == 0)
return 0; int start = 0;
int end = 0;
int res = Integer.MAX_VALUE;
int sum = nums[start]; while(true)
{
if(sum < s)
{
// shift end to right one place
if(end + 1 == nums.length)
break; sum += nums[++end];
}
else if(sum >= s)
{
// get the smaller size
res = Math.min(res, end - start + 1); if(end == start)
break; // shift start to right one place
sum -= nums[start++];
}
} if(res == Integer.MAX_VALUE)
res = 0; return res;
}
}
方法2:O(n log n) 利用 二分法来找到最小符合要求的 window size
要利用 binary search 的话,需要一个有序的数组,所以我们需要新设一个 原nums size + 1 的新 array sums, 把每一个从0 到 i (在nums中) 的sum 存入 新 array 的 index 1 到最后。
所以新的array 里, 从index 1 到最后的 每一个值 都是 原nums 相对应的 0 到 i 的sum。
原题例子:
nums 2 3 1 2 4 3 原 array
sums 0 2 5 6 8 12 15 新 array 第一个位置不用,后面每一个数字都是 nums 里相对应的sum值
在有了这个有序数组之后, 可以遍历新 array index 1 开始的每一个数字, 找到每一个最小的右边边界 (sums[i] + s) ,然后记录一个最小的window size 就可以了。
Java Solution:
Runtime beats 12.29%
完成日期:09/04/2017
关键词:Array,Binary Search
关键点:新建一个 ascending sums array 对应 nums array;
用二分法找到符合s要求的最小的window size
class Solution
{
public int minSubArrayLen(int s, int[] nums)
{
int[] sums = new int[nums.length + 1]; for (int i = 1; i < sums.length; i++)
sums[i] = sums[i - 1] + nums[i - 1]; int minLen = Integer.MAX_VALUE; for (int i = 0; i < sums.length; i++)
{
int end = binarySearch(i + 1, sums.length - 1, sums[i] + s, sums); if (end == sums.length)
break; if (end - i < minLen)
minLen = end - i;
}
return minLen == Integer.MAX_VALUE ? 0 : minLen;
} public int binarySearch(int lo, int hi, int key, int[] sums)
{
while (lo <= hi)
{
int mid = (lo + hi) / 2; if (sums[mid] >= key)
hi = mid - 1;
else
lo = mid + 1; }
return lo;
}
}
参考资料:
https://discuss.leetcode.com/topic/13749/two-ac-solutions-in-java-with-time-complexity-of-n-and-nlogn-with-explanation
LeetCode 算法题目列表 - LeetCode Algorithms Questions List
LeetCode 209. Minimum Size Subarray Sum (最短子数组之和)的更多相关文章
- [LeetCode] 209. Minimum Size Subarray Sum 最短子数组之和
Given an array of n positive integers and a positive integer s, find the minimal length of a contigu ...
- [LeetCode] Minimum Size Subarray Sum 最短子数组之和
Given an array of n positive integers and a positive integer s, find the minimal length of a subarra ...
- Minimum Size Subarray Sum 最短子数组之和
题意 Given an array of n positive integers and a positive integer s, find the minimal length of a suba ...
- LeetCode 209 Minimum Size Subarray Sum
Problem: Given an array of n positive integers and a positive integer s, find the minimal length of ...
- Java for LeetCode 209 Minimum Size Subarray Sum
Given an array of n positive integers and a positive integer s, find the minimal length of a subarra ...
- 【刷题-LeetCode】209. Minimum Size Subarray Sum
Minimum Size Subarray Sum Given an array of n positive integers and a positive integer s, find the m ...
- LeetCode OJ 209. Minimum Size Subarray Sum
Given an array of n positive integers and a positive integer s, find the minimal length of a subarra ...
- [LeetCode] 930. Binary Subarrays With Sum 二元子数组之和
In an array A of 0s and 1s, how many non-empty subarrays have sum S? Example 1: Input: A = [1,0,1,0, ...
- 【LeetCode】209. Minimum Size Subarray Sum 解题报告(Python & C++)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 题目地址: https://leetcode.com/problems/minimum- ...
随机推荐
- Linux 的集中重启的方法
linux中有下面几条命令可以实现重新启动,这些命令都需要root用户的权限: reboot shutdown -r now #立刻重启 shutdown -r #过10分钟自动重启 shutdown ...
- Angular2响应式表单
本文将半翻译半总结的讲讲ng2官网的另一个未翻译高级教程页面. 原文地址. 文章目的是使用ng2提供的响应式表单技术快速搭出功能完善丰富的界面表单组件. 响应式表单是一项响应式风格的ng2技术,本文将 ...
- linux kill 命令
kill 命令的用途 kill 命令很容易让人产生误解,以为它仅仅就是用来杀死进程的.我们来看一下 man page 对它的解释:kill - send a signal to a process. ...
- Angularjs –– Expressions(表达式)
点击查看AngularJS系列目录 转载请注明出处:http://www.cnblogs.com/leosx/ Angular的表达式 Angular的表达式和JavaScript代码很像,不过通常A ...
- ios小型服务器环境配置
之前买的一台二手iphone4退役了,上闲鱼上一看,就值200,而且耳机声音也有点轻,估计买不了什么钱 于是网上看看能不能有什么废物利用的法子,看到说做行车记录仪的,有说做git服务器的,感觉挺有兴趣 ...
- Quartz源码——JobStore保存JonDetail和Trigger源码分析(一)
我都是分析的jobStore 方式为jdbc的SimpleTrigger!RAM的方式类似分析方式! {0} :表的前缀 ,如表qrtz_trigger ,{0}== qrtz_ {1}:quartz ...
- C#设计模式之五创建者模式(Builder)【创建型】
一.引言 今天我们要讲讲Builder模式,也就是建造者模式,当然也有叫生成器模式的.在现实生活中,我们经常会遇到一些构成比较复杂的物品,比如:电脑,它就是一个复杂的物品,它主要是由CPU.主板.硬 ...
- Rundeck部署和基本使用
rundeck 介绍 Rundeck 是一款能在数据中心或云环境中的日常业务中使程序自动化的开源软件.Rundeck 提供了大量功能,可以减轻耗时繁重的体力劳动.团队可以相互协作,分享如何过程自动化, ...
- HADOOP源码分析之RPC(1)
源码位于Hadoop-common ipc包下 abstract class Server 构造Server protected Server(String bindAddress, int port ...
- 移植u-boot-2012.04.01到JZ2440
开发环境:Ubuntu 12.04 开发板:JZ2440 256M NandFlash 64M SDRAM 交叉编译器:arm-linux-gcc-4.3.2 u-boot:u-boot-2012 ...