[英]Given an array and a sum, find the max length continous subarray less than the sum
我有一個array [1,2,3],總和為4,所以所有連續的子數組都是[1],[1,2] [2,3] ans [1,2,3]。 因此,小於或等於sum的最大長度子數組為[1,2],長度為2。
我已通過以下方法找到了所有子數組並檢查了子數組的總和,如下所示。 但是這種方法不適用於負數。 {1,2,1,1,3,-2,-3,7,9}; -回答:7
private static void maximumSubArray(int[] a, int sum) {
int start = 0;
int end =0;
int mylen =-1;
int subarrSum =0;
for(int i=0;i<a.length;i++){
subarrSum += a[i];
end++;
while(subarrSum > sum){
subarrSum-= a[start];
start +=1;
}
mylen = Math.max(mylen, end-start);
}
System.out.println(mylen + " -- My len");
}
這是經典最大連續子數組問題的變體。 您可以使用動態編程 (存儲)來解決此問題。 嘗試這樣的事情:
private static void maximumSubArray(int[] a, long sum, int maxLen) {
long maximumSoFar = Long.MIN_VALUE;
long maximumEndingHere = Long.MIN_VALUE;
for (int i = 0; i < a.length; i++) {
// if you're inside the array beyond maxLen, start dropping off the previous start element
int prevStart = i >= maxLen ? a[i - maxLen] : 0;
maximumEndingHere = Math.max(a[i], maximumEndingHere + a[i] - prevStart);
if (maximumEndingHere > maximumSoFar && maximumEndingHere <= sum) {
maximumSoFar = maximumEndingHere;
} else if (a[i] > maximumSoFar && a[i] <= sum) {
maximumSoFar = a[i];
} else if (maximumEndingHere > sum) {
maximumEndingHere -= prevStart;
}
}
System.out.println(maximumSoFar);
}
如果有更多時間,我會以更簡潔的方式在for循環中編寫邏輯,但這應該可以工作,並且可以在O(n)時間內工作。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.