***干貨:
子數(shù)組問題思路:必須以某個位置結(jié)尾的情況下怎么怎么樣
雙指針問題思路:算出來的一個指標可以指導我的雙指針下一步應該怎么動
題目
未排序正數(shù)數(shù)組中累加和為給定值的最長子數(shù)組長度
例如:[1,2,3,1,1,1]目標值為3,那么最長長度為3
算法步驟
使用兩個指針,left和right,記錄從left到right之間的元素的值得和,使用一個變量res記錄長度。如果這個和大于目標,那么left加一,如果這個和小于目標,那么right+1,如果這個值等于目標,那么比較并更新res,同時left++。
right超過最右邊的時候結(jié)束循環(huán)
算法原理
假設客觀條件下[left,right]為和為目標值的最長子數(shù)組,那么根據(jù)我們的策略首先left不會在right的右邊,其次left也不會在區(qū)間內(nèi),最后left也不會在前邊,因為在前邊也會被最后移動過來。
代碼
public static int getMaxLength(int[] arr,int target){
if(arr==null||arr.length==0||target<=0)
return 0;
int left=0;
int right=0;
int sum=0;
int len=0;
while(right<arr.length){
if(sum<target) {
right++;
if (right == arr.length)
break;
sum += arr[right];
}
else if(sum>target)
sum-=arr[left++];
else{
len=Math.max(len,right-left+1);
sum-=arr[left++];
}
}
return len;
}