トピック
リンク:https://leetcode-cn.com/problems/longest-increasing-subsequence/
中難易度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]を取り上げます
- 元の配列countArrayをコピーすると、デフォルト値は1で埋められ、countArrayは[1,1,1,1,1,1,1,1]になります。
- 2番目の位置からトラバースを開始します。最初の位置は常に1、2番目の位置index = 1、この時点では9 <10であるため、countArrayの2番目の位置の値は1のままです。
- 3番目の位置では、2が10と比較され、2が9と比較され、3番目の位置も1です。
- 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番目の位置3> 2は、countArray [4] = countArray [2] +1であり、この時点でのcountArrayは[1,1,1,2,2,1,1,1]です。
- この時点での6番目の位置7> 2は、countArray [5] = countArray [2] +1であり、この時点でのcountArrayは[1,1,1,2,2,2,1,1]です。
- この時点での6番目の位置7> 5は、countArray [5] = countArray [3] +1であり、この時点でのcountArrayは[1,1,1,2,2,3,1,1]です。
- この時点での6番目の位置7> 3は、countArray [5] = countArray [4] +1であり、この時点でのcountArrayは[1,1,1,2,2,3,1,1]です。
- 。。。類推により、最終的に完全なcountArrayを取得します
- 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;
}
}