maxlength - juedaiyuer/researchNote GitHub Wiki

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

package myAlgorithm.array;

/**
 * Created by juedaiyuer on 16-11-9.
 */
public class myArray {
	
	/*
	* Task:未排序正数数组中累加和为给定值的最长子树组长度
	* 
	* 时间复杂度O(n),额外空间复杂度O(1)
	* 
	* 步骤
	* 1. arr[left...right]长度大于len,更新len
	* 
	* sum==k
	* 
	* 2. arr[left...i(i>right)],累加和一定大于k,所以另left+1,考察left之后位置开始的子数组,同时sum -= arr[left]
	*    sum 此时表示arr[left+1...right]的累加和
	*    
	* sum<k 说明arr[left...right] 还要加上right后面的值,其和才可能达到k 
	* 
	* 3. right+1,即sum+=arr[right]
	* 
	* sum>k 说明所有从left位置开始,在right之后的位置结束的子数组,即arr[left...i(i>right)],累加和一定大于k
	* 
	* 4. left+1 sum-=arr[left];sum此时代表着arr[left+1...right]的累加和
	* 
	* */
	public int getMaxLength(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);    // 步骤1
	            sum -= arr[left++];                  // 步骤2
	        }else if (sum < k){
	            right++ ;
	            if (right == arr.length){
	                break;
	            }
	            sum += arr[right];
	        }else {                                  // sum>k
	            sum -=arr[left++];
	        }
	    }
	    return len;
	}
}