题目:
给定一个数组arr,该数组无序,每个数正数,给定一个K,求arr的所有子数组中所有元素相加和为k的最长子数组的长度。
例如:arr=[1,2,1,1,1],k=3
结果是3,[1,1,1]的长度。
思路:
首先用两个位置来标记子数组左右两头,记为left与right,开始的时候都在数组的最左边即left=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,如果长度大于len,更新len
package Array; import java.util.Scanner; /** * Created by wuxiaosi on 2017/9/24. */ public class getMaxLength { public static void main(String[] args){ int k=3; int[] arr={1,2,1,1,1}; System.out.println(getMaxLengthK(arr,k)); } public static int getMaxLengthK(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=sum-arr[left++]; } else if(sum<k){ right++;//向右移动 if(right==arr.length){//right到数组边界长度,就break break; } sum=sum+arr[right]; }else{ sum=sum-arr[left++]; } } return len; } }