解決最大子陣列之和的兩種方法

2021-10-03 22:54:29 字數 1259 閱讀 3027

自己碼了一遍這個演算法,然後網上找了下題目分析。發現了更好的解法:解決最大子陣列之和的三種方法,在此記錄一篇簡述心得。

拿到題目自己理解的有誤,一直在想怎麼一邊計算和一邊記錄 start&end 索引。其是題目沒有這個要求。

因為最大子陣列 startindex 和 endindex 不確定,所以肯定需要for迴圈遍歷來確定。

因為遍歷所有元素作為 startindex 需要一層for迴圈,另外遍歷所有元素作為endinex也需要一層for迴圈。所以一定需要兩層for迴圈。

計算 endindex 思路:例如陣列是[a, b, c, d, e],如果a + b > 當前最新的count,則更新 count;否則不更新,繼續累加。

2層遍歷結束,最終的 count 就是最大的和。

public static void solution(int array) }}

system.out.println("startindex:" + startindex + ", endindex:" + endindex + ", count:" + count);

}

先說一下我的思路:陣列 [a, b, c, d, e] 中可能有負數,否則最大值就是整個陣列元素之和。我們開始遍歷累加陣列元素,例如 a+b,假如a為正數(如果a為負數則從b開始計算),如果 b 為負數,則判斷 b+c 是否為正數,如果b+c是正數則當前最大子串行為 a+b+c,否則再計算 b+c+d是否為正數。以此類推。那麼問題來了,雖然感覺這思路方向沒問題,但是**不好寫,首先第一層遍歷少不了,但是判斷 b+c+d 是否為正數是用遞迴還是用遍歷呢?如果用遍歷那麼效率和解法一相同,用遞迴**又變複雜了。怎麼辦?

答案就在這篇文章:解決最大子陣列之和的三種方法

我的思路錯誤在:遍歷是從左到右,但是另一塊判斷加上右邊的b 後對總和是否是正向影響。一左一右,方向不一致,出現了矛盾點。

正確的思路:遍歷依然是從左到右,但是累加判斷分拆為兩點

[條件1]:a+b後和 是否大於 當前的最大值,如果大於當前的最大值則更新最大值

[條件2]:a+b之後的和是否小於b,如果小於b,代表b之前的元素之和是負數,需要拋棄,b為最新的startindex。

累加的判斷拆分為以上兩點,但是寫**時要先 判斷[條件2],再判斷[條件2],因為更新累加和的邏輯一定在**塊的末尾位置。

public static void solution(int arr) 

}system.out.println(max);

}

陣列的最大子串行之和

問題描述 求最大子串行之和一直是讓人困擾的問題,之所以困擾,主要是由於沒有想清楚該怎樣操作,下面給出一種最暴力的求解方法,利用多重迴圈來求解最大子串行和,每次對給定子序列求和,把它與剛開始設定的最大值進行計較,如果它大於設定的最大值,將它設定為最大值,記錄最大值的初始位置和終端位置,然後輸出就是最大...

兩種方法解決約瑟夫問題

第一種 構建迴圈鍊錶,然後不斷遍歷鍊錶直到剩下最後乙個元素。include include include include include include using namespace std typedef struct list list,link int main p next head n...

兩種方法解決排列問題

time limit 1.000 sec memory limit 128 mb problem description 有4個互不相同的數字,請按序輸出由其中三個不重複數字組成的排列。input 4個整數。output 所有排列,輸出順序見樣例。sample input 1 2 3 4 out i...