記事ディレクトリ
シリーズ: 貪欲なアルゴリズムのトレーニング
言語: Java
トピック ソース: Leetcode53 最大部分配列合計
難易度: 中
テスト ポイント: 貪欲なアルゴリズムのアイデアと && 暴力的なアルゴリズムの理解
トピックの説明
整数配列 nums が与えられた場合、合計が最大の連続部分配列 (部分配列には少なくとも 1 つの要素が含まれる) を見つけ、その最大合計を返します。サブ配列は、配列の連続部分です。
例 1: >入力: nums = [-2,1,-3,4,-1,2,1,-5,4] 出力: 6 説明: [4,-1,2,1] と [4,-1,2,1] の連続する部分配列最大6。
例 2: >入力: nums = [1] 出力: 1**** プロンプト: > 1 <= nums.length <= 10 5-10 4 <= nums[i] <= 10^4
1. 2 つの考え方:
暴力的な方法と貪欲なアルゴリズム(dp を使用できる友人は、dp を使用して解決することができます。ここでは 2 つのアイデアのみを示します) for ループはそれを完全に解決しますが、質問の制限によると、時間の複雑さは条件を満たさず、間違いなくタイムアウトになります; 分析は次のとおりです: 質問の制限の長さ: 1 <= nums.長さ <= 10 5, 2 層の for ループ データは10 8 になります. 2 層の for ループは約 5000 データしか処理できないため、タイムアウトする必要がありますが、私たちは暴力的に思考を行使できます. 参照コードは次のとおりです.貪欲アルゴリズム: 貪欲アルゴリズムにはテンプレートがなく、主なテストは問題解決のアイデアです; この問題では、局所最適を達成する方法は、for ループのレイヤーを使用してトラバースします。つまり、連続和は0 より大きい場合、連続合計が 0 未満の場合は、0 より前の間隔の合計を記録し、次に i+1 で、間隔の計算を再開し、最後に複数の間隔のサイズを比較して最大のものを見つけます。 interval sum;例: 3 -5 3 1 -3 -1 When i=0, num =3; when i=1, num =-2 ; このとき、連続合計が 0 未満の場合、result を使用して連続合計が 0 になる前の間隔合計を記録 この時点で 3; このとき、ヘッドは i=0,3 から開始し、この間隔を終了し、ヘッドを -5 から移動します 次の i=2 から開始し、再計算しますnum を選択し、価格と結果を比較します。
2. 参照コード暴力法:
class Solution {
暴力法:
public int maxSubArray(int[] nums) {
int num =Integer.MIN_VALUE;
for(int i =0;i<nums.length;i++){
int result =0;
int j =i;
while(j<nums.length){
result += nums[j];
num=result>num?result:num; j++; } }
return num; }}```
贪心算法
```java
class Solution {
// 贪心算法
// 如果连续和为负数了 那么记下此时的为0前的值 从下一个开始从新计数,通过比较下一个区间的和,然后判断 public int maxSubArray(int[] nums) {
int result = Integer.MIN_VALUE;
int num = 0;
for(int i =0;i<nums.length;i++){
num += nums[i];
if(num>result){
result = num; }
if(num<0){
num =0; } } return result; }}```
以上分析,希望对您有所帮助,您的支持是我最大的动力,感谢一键三连!!