毎日の質問: Leetcode53 サブ配列の最大合計

記事ディレクトリ

シリーズ: 貪欲なアルゴリズムのトレーニング
言語: 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;    }}```
以上分析,希望对您有所帮助,您的支持是我最大的动力,感谢一键三连!!

おすすめ

転載: blog.csdn.net/weixin_54174102/article/details/130049616