Java学习手册:(数据结构与算法-数组)Minimun Size Subarray Sum(leetcode209)

本文探讨了给定数组中寻找最短连续子数组的问题,该子数组的元素和大于等于给定值s。介绍了两种解决方案:暴力法和双索引技术(滑动窗口),并详细分析了它们的时间和空间复杂度。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

问题:

给定一个整型数组和一个数字s,找到数组中最短的一个连续子数组,使得连续子数组的数字和sum>=s,返回这个最短的连续子数组的长度值。

示例:

如,给定数组[2, 3, 1, 2, 4, 3],s = 7。答案为[ 4, 3 ],返回2。

方法一:

暴力法,遍历所有的连续子数组[i…j],计算其和sum,验证sum>=s,时间复杂度O(n^2)。

方法一代码:
package com.haobi;

public class MinSubArrayLen {
	public static void main(String[] args) {
//		int[] arr = {1,2,4,5,7,8,4,5,6,1,2,5};
		int[] arr = {1,5,1,5,1,5,1,5,1,5,1,5};
		minSubArrayLen(10, arr);
	}
	public static void minSubArrayLen(int s, int[] arr) {
		int count = 0;
		int index = 0;
		int minLen = Integer.MAX_VALUE;
		for(int i=0;i<arr.length;i++) {
			for(int j=i;j<arr.length;j++) {
				count += arr[j];
				index++;
				if(count >= s && index < minLen) {
					minLen = index;
					count = 0;
					index = 0;
					continue;
				}
			}
		}
		System.out.println(minLen);
	}
}
方法二:

双索引技术/滑动窗口
时间复杂度:O(n)
空间复杂度:O(1)

方法二代码:
package com.haobi;

public class MinSubArrayLen1 {
	public static void main(String[] args) {
//		int[] arr = {1,2,4,5,7,8,4,5,6,1,2,5};
		int[] arr = {1,5,1,5,1,5,1,5,1,5,1,5};
		System.out.println(minSubArrayLen(10, arr));
	}
	public static int minSubArrayLen(int s, int[] nums) {
		int l = 0,r = -1;//nums[l...r]为我们的滑动窗口
		int sum = 0;
		int res = nums.length + 1;//初始化
		while(l < nums.length) {
			if(sum < s && r+1 < nums.length) {
				sum += nums[++r];
			}else {
				sum -= nums[l++];
			}
			if(sum >= s) {
				if(res > r-l+1) {
					return r-l+1;
				}else {
					return res;
				}
			}
		}
		if(res == nums.length+1)
			return 0;
		return res;
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值