长度最小的子数组(暴力/动态规划)

烂漫一生 提交于 2020-07-29 03:31:42

给定一个含有 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 学艺不精,先码在这里,多刷点动规额题,以后遇到这种题,再回头看看

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!