leetcode300。最長増加部分列

トピック

リンク:https//leetcode-cn.com/problems/longest-increasing-subsequence/

 

300.最長増加部分列

中難易度1333

整数の配列が与えられた場合 nums 、厳密に増加する最長のサブシーケンスの長さを見つけます。

サブシーケンスは、配列から派生したシーケンスであり、残りの要素の順序を変更せずに、配列内の要素を削除します(または削除しません)。たとえば[3,6,2,7] 、配列の[0,3,1,6,2,2,7] サブシーケンスです 

 

例1:

入力: nums = [10,9,2,5,3,7,101,18]
出力: 4
説明:最長増加部分列は[2,3,7,101]であるため、長さは4です。

例2:

入力: nums = [0,1,0,3,2,3]
出力: 4

例3:

入力: nums = [7,7,7,7,7,7,7]
出力: 1

分析

    推奨される参照:https//blog.csdn.net/mk33092250/article/details/113862228

     注:サブ配列の最大値を見つける一般的な問題は、1次元配列を介して変換できます。配列の最大値の問題が発生した場合は、1次元配列を介して取得できるかどうかを優先できます。 -次元配列変換。

    アイデアは次のとおりです。

1.増加するサブシーケンスを解き、それを変換して、1次元配列を介して各インデックス位置に対応する増加するサブシーケンスを保存します。

2.各位置の数は1以上でなければならないため、デフォルト値は1で埋められます。

int[] countArray=new int[nums.length];
Arrays.fill(countArray,1);

3.各位置で最も長く増加するサブシーケンスを決定する方法は?現在の位置がcountArrayと比較されます。現在の要素が前の要素より大きく、現在の要素の数が前の要素より少ない場合、現在の要素の値は前の要素の値+1に設定されます。 、これは理解しにくいです。完全な例を見てみましょう。

例えば

例として[10,9,2,5,3,7,101,18]を取り上げます

  1. 元の配列countArrayをコピーすると、デフォルト値は1で埋められ、countArrayは[1,1,1,1,1,1,1,1]になります。
  2. 2番目の位置からトラバースを開始します。最初の位置は常に1、2番目の位置index = 1、この時点では9 <10であるため、countArrayの2番目の位置の値は1のままです。
  3. 3番目の位置では、2が10と比較され、2が9と比較され、3番目の位置も1です。
  4. 4番目の位置5と10が比較され、5と9は比較より大きくありません。5と2を比較すると、5> 2であり、この時点で、countArray [3] = countArray [2] +1、(countArray of 3と2元の配列5と2にそれぞれ対応するインデックス)countArrayは[1,1,1,2,1,1,1,1]になりました。
  5. この時点での5番目の位置3> 2は、countArray [4] = countArray [2] +1であり、この時点でのcountArrayは[1,1,1,2,2,1,1,1]です。
  6. この時点での6番目の位置7> 2は、countArray [5] = countArray [2] +1であり、この時点でのcountArrayは[1,1,1,2,2,2,1,1]です。
  7. この時点での6番目の位置7> 5は、countArray [5] = countArray [3] +1であり、この時点でのcountArrayは[1,1,1,2,2,3,1,1]です。
  8. この時点での6番目の位置7> 3は、countArray [5] = countArray [4] +1であり、この時点でのcountArrayは[1,1,1,2,2,3,1,1]です。
  9. 類推により、最終的に完全なcountArrayを取得します
  10. countArrayをトラバースして、最大値を取得します。これは、増加する最大のサブシーケンスです。

コード

package org.example;

import java.util.Arrays;

public class Leetcode300 {
    public static void main(String[] args) {
        Leetcode300 leetcode300 = new Leetcode300();
        //int[] param=new int[]{10,9,2,5,3,7,101,18};
        int[] param=new int[]{10,9,2,5,3,7,101,18,19,20};
        System.out.println(leetcode300.lengthOfLIS(param) );;
    }

    public int lengthOfLIS(int[] nums) {
        int[] countArray=new int[nums.length];
        Arrays.fill(countArray,1);
        int result=1;
        for (int i = 1; i < nums.length; i++) {
            for (int j = 0; j < i; j++) {
                if (nums[i]>nums[j]&&countArray[i]<=countArray[j]){
                    countArray[i]=countArray[j]+1;
                    if (countArray[i]>result){
                        result=countArray[i];
                    }
                }
            }
        }
        return result;
    }
}

 

おすすめ

転載: blog.csdn.net/mk33092250/article/details/113862996