209. Minimum Size Subarray Sum
来源:互联网 发布:linux grub 配置 编辑:程序博客网 时间:2024/06/05 22:31
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.
给定一组数和一个值,找到最短的子串,使得子串的和大于等于给定值。
我的思路:
模拟双指针的操作:
class Solution {public: int minSubArrayLen(int s, vector<int>& nums) { int n=nums.size(); if(n==0) return 0; int i=0; int j=0; int sum=0; int d=numeric_limits<int>::max(); while(j<n) { while(sum<s&&j<n) sum+=nums[j++]; if(j==n&&sum<s) return d==numeric_limits<int>::max()?0:d; j--; d=min(d,j-i+1);//j指向当前最后一个元素,i指向第一个元素 if(d==1) break; sum-=nums[i++]; if(j==n-1)//j已经到末尾了 { while(sum-nums[i]>=s) { sum-=nums[i++]; d=min(d,j-i+1); } break; } if(j<n-1) { j++; sum-=nums[i++]; while(sum-nums[i]+nums[j]>=s) { sum-=nums[i++]; d=min(d,j-i+1); } } } return d<=n?d:0; }};
使用双指针较为简洁的方法:
class Solution {public: int minSubArrayLen(int s, vector<int>& nums) { int n=nums.size(); if(n==0) return 0; int left=0; int sum=0; int d=numeric_limits<int>::max(); for(int i=0;i<n;i++) { sum+=nums[i]; while(sum>=s) { d=min(d,i+1-left); sum-=nums[left++]; } } return d==numeric_limits<int>::max()?0:d; }};
另外一种二分法,虽然复杂度是nlogn的但是,也值得掌握
明天看吧:
int minSubArrayLen(int s, vector<int>& nums){ int n = nums.size(); if (n == 0) return 0; int ans = INT_MAX; vector<int> sums(n + 1, 0); //size = n+1 for easier calculations //sums[0]=0 : Meaning that it is the sum of first 0 elements //sums[1]=A[0] : Sum of first 1 elements //ans so on... for (int i = 1; i <= n; i++) sums[i] = sums[i - 1] + nums[i - 1]; for (int i = 1; i <= n; i++) { int to_find = s + sums[i - 1]; auto bound = lower_bound(sums.begin(), sums.end(), to_find); if (bound != sums.end()) { ans = min(ans, static_cast<int>(bound - (sums.begin() + i - 1))); } } return (ans != INT_MAX) ? ans : 0;}
阅读全文
0 0
- 209.Minimum Size Subarray Sum
- 209.Minimum Size Subarray Sum
- 209. Minimum Size Subarray Sum
- 209. Minimum Size Subarray Sum
- 209. Minimum Size Subarray Sum
- 209. Minimum Size Subarray Sum
- 209. Minimum Size Subarray Sum
- 209. Minimum Size Subarray Sum
- 209. Minimum Size Subarray Sum
- 209. Minimum Size Subarray Sum
- 209. Minimum Size Subarray Sum
- 209. Minimum Size Subarray Sum
- 209. Minimum Size Subarray Sum
- 209. Minimum Size Subarray Sum
- 209. Minimum Size Subarray Sum
- 209. Minimum Size Subarray Sum
- 209. Minimum Size Subarray Sum
- 209. Minimum Size Subarray Sum
- 5.计算机组成原理笔记五输入输出系统
- Java的四种引用方式
- python5
- relayfs介绍
- HDU 5763Another Meaning (DP+KMP||后缀数组)
- 209. Minimum Size Subarray Sum
- Texture Filtering
- Linux命令详解:md5sum
- Eureka 高可用
- 图_SimpleGraph
- java基础[9]集合总结
- Java中堆内存和栈内存详解
- 使用python语言操作MongoDB
- 考题