簡體   English   中英

給定一個數組和一個和,找到小於該和的最大長度連續子數組

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM