import java.util.*;
//未排序正数数组中累加和为给定值的最长子数组长度
public class MaxSubArrLen{
//方法一:排序后选择O(N*N)
public static int GetMaxSub(int[]arr,int k)
{
if(arr==null||k<=0||arr.length==0)
{
return 0;
}
Arrays.sort(arr);
if(arr[0]>k)
{
return 0;
}
int sum=0;
int len=0; //子数组的长度
for(int i=0;i<arr.length;i++)
{
sum+=arr[i];
if(sum==k)
{
len=Math.max(len,i+1);
}else if(sum>k)
{
for(int j=0;j<i;j++)
{
if(sum-arr[j]==k)
{
len=i-j;
break;
}
}
}
}
return len;
}
//方法二:指正的移动,时间复杂度为O(N)
public static int GetMaxSub2(int[] arr, int k) {
if (arr == null || arr.length == 0 || k <= 0) {
return 0;
}
int left = 0;
int right = 0;
int sum = arr[0];
int len = 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;
}
public static void main(String[]args)
{
int[]arr={1,2,1,1,1};
int k=3;
System.out.println(GetMaxSub(arr,k));
System.out.println(GetMaxSub2(arr,k));
}
}
未排序正数数组中累加和为给定值的最长子数组长度
最新推荐文章于 2021-06-07 17:08:52 发布