package matrix_and_array;
/**
* 题目:未排序正数数组中累加和为给定值的最长子数组长度
*
* 问题描述:给定一个数组 arr ,该数组无序,但每个值均为正数,再给定一个正数k。求 arr 所有子数组中所有元素相加和为 k 的最长子数组长度。
*
* 例如: arr = [1,2,1,1,1],k=3.
* 累加和为3的最长子数组为[1,1,1],所以返回结果为 3
*
* 最优解可以做到时间复杂度为O(N),额外空间复杂度为O(1)
*
* @author sgy
*
*/
public class MaxSub_len {
public static void main(String[] args) {
// TODO Auto-generated method stub
int a[] = {1,2,2,2,6,1,1,1,1,1,1};
System.out.println(getMaxLength(a, 6));
}
/**
*
* @param arr 数组
* @param k 指定和
* @return 和为指定值的子数组的最大长度
*/
public static int getMaxLength(int[] arr,int k){
if(arr == null || arr.length == 0 || k<=0){
return 0;
}
int sum = arr[0]; //当前子数组的和,从第一个元素开始
int len = 0; //当前子数组的长度
int left =0, right = 0; //分别记录子数组的左右边界
while(right < arr.length){
if(sum<k){
right++; //应该先判断下标,然后++,防止数组越界
if(right == arr.length)
break;
sum+=arr[right];
}else if(sum == k){
len = len>(right-left+1)?len:(right-left+1);
sum-=arr[left]; //子数组左边界右移
left++;
}else{
sum-=arr[left];
left++;
}
}
return len;
}
}
未排序正数数组中累加和为给定值的最长子数组长度
最新推荐文章于 2021-08-14 14:14:13 发布