给定一个含有 n 个正整数的数组和一个正整数 s ,找出该数组中满足其和 ≥ s 的长度最小的连续子数组,并返回其长度。如果不存在符合条件的连续子数组,返回 0。
示例:
输入: s = 7, nums = [2,3,1,2,4,3]
输出: 2
解释: 子数组 [4,3] 是该条件下的长度最小的连续子数组。
进阶:
如果你已经完成了O(n) 时间复杂度的解法, 请尝试 O(n log n) 时间复杂度的解法。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/minimum-size-subarray-sum
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
//暴力
public class Main {
public static void main(String[] args) {
int s = 3;
// int s = 7;
// int[] nums ={2,3,1,2,4,3};
int[] nums = {1,1};
System.out.println(minSubArrayLen(s, nums) );
}
public static int minSubArrayLen(int s, int[] nums) {
int ans = 99999;
int sum = 0;
int tmp = 0;
if (nums.length == 0) {
return 0;
}
for (int i=0; i<nums.length; i++) {
sum += nums[i];
}
if (sum < s) {
return 0;
}
for (int i=0; i<nums.length; i++) {
sum = 0;
tmp = 0;
for (int j=i; j<nums.length; j++) {
sum += nums[j];
tmp++;
if (sum >= s && ans >= tmp) {
ans = tmp;
break;
}
}
}
return ans;
}
}
/**
*二分查找
*
*/
import java.util.Arrays;
public class Main {
public static void main(String[] args) {
int s = 11;
// int s = 7;
// int[] nums ={2,3,1,2,4,3};
int[] nums = {1,2,3,4,5};
System.out.println(minSubArrayLen(s, nums) );
}
public static int minSubArrayLen(int s, int[] nums) {
int n = nums.length;
if (n == 0) {
return 0;
}
int ans = Integer.MAX_VALUE;
int sums[] = new int[n+1];
for (int i=1; i<=n; i++) {
sums[i] = nums[i-1] + sums[i-1];
}
for (int i=0; i<=n; i++) {
int tmp = s + sums[i]; //找到sums数组中,[i,j]之间的差值,差值大于s既是目标
int index = Arrays.binarySearch(sums, tmp);
if (index < 0) {
index = -index - 1;
}
if (index <= n) { //区间不能超过字符串长度
ans = Math.min(ans, index-i);//取最小区间
}
}
return ans == Integer.MAX_VALUE ? 0 : ans;
}
}
感觉可以用动态规划,但我查了下不能用,因为不具备最有子结构 https://my.oschina.net/mustang/blog/63532 学艺不精,先码在这里,多刷点动规额题,以后遇到这种题,再回头看看
来源:oschina
链接:https://my.oschina.net/u/4408224/blog/4328765