未排序正数数组中累加和为给定值的最长子数组长度

【题目】给定一个数组arr,该数组无序,但每个值都是正数,再给定一个正数k, 求arr的所有子数组中所有元素相加和为K的最长子数组长度。

思路:两个变量left和right标记子数组左右两头,开始left = 0,right = 0

1.开始时变量left = 0, right = 0,代表子数组arr[left…right].

2.变量sum始终表示子数组arr[left…right]的和。开始时sum = arr[0], 即arr[0…0]的和。

3.变量len一直记录累加和为k的所有子数组中最大子数组的长度。开始时,len = 0.

4.根据sum 与 k 的比较结果决定left和right移动,具体如下:

  • 如果sum == k, 说明arr[left…right]累加和为k,如果arr[left…right]长度大于len, 则更新len,并令left+1,sum -=arr[left],sum开始表示arr[left+1…right]的累加和。
  • 如果sum < k,令right+1,sum += arr[right]。
  • 如果sum > k,令left+1,sum-=arr[left]。

5.如果right < arr.length, 重复步骤4.否则直接返回len, 全部过程结束。

public class MaxLengthPositive {
	public static int maxLength(int[] arr, int k) {
		if (arr.length == 0 || arr == null || k <= 0) {
			return 0;
		}
		int len = 0;
		int sum = 0;
		int left = 0;
		int right = 0;
		sum = arr[0];
		while (right < arr.length) {
			if (sum == k) {
				len = Math.max(len, right - left + 1);
				sum -= arr[left++];
			} else if (sum < k) {
				right++;
				if (right == arr.length) {
					break;
				}
				sum += arr[right];
			} else {
				sum -= arr[left++];
			}
		}
		return len;
	}
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值