题目
链接: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.求解递增子序列,转换为通过一个一维数组保存每个index位置对应的递增子序列
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];
- 从第二个位置开始遍历,第一个位置恒为1,第二个位置index=1,此时9<10,所以countArray第二个位置的value还是为1
- 第三个位置,2和10比较,2再和9比较,第三个位置也为1
- 第四个位置,5和10比较,5和9比较都不大于,当5和2比较时,5>2,此时,countArray[3]=countArray[2]+1,(countArray的3和2分别是原数组5和2对应的index) countArray此时为[1,1,1,2,1,1,1,1]
- 第五个位置,3>2,此时countArray[4]=countArray[2]+1,countArray此时为[1,1,1,2,2,1,1,1]
- 第六个位置,7>2,此时countArray[5]=countArray[2]+1,countArray此时为[1,1,1,2,2,2,1,1]
- 第六个位置,7>5,此时countArray[5]=countArray[3]+1,countArray此时为[1,1,1,2,2,3,1,1]
- 第六个位置,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;
}
}