package com.wsq.dp;
/**
* 300. 最长上升子序列
* @author wsq
* @date 2020/10/19
给定一个无序的整数数组,找到其中最长上升子序列的长度。
示例:
输入: [10,9,2,5,3,7,101,18]
输出: 4
解释: 最长的上升子序列是 [2,3,7,101],它的长度是 4。
链接:https://leetcode-cn.com/problems/longest-increasing-subsequence
*/
public class LengthOfLIS {
/**
* 动态规划
* 1.确定状态
* f[i]表示i之前构成的最大上升序列
* 最后一步:能够达到f[i]的情况可以是i之前的所有比nums[i]小的元素
* 子问题:求得i之前的最长上升子序列的状态
* 2.定义转移方程
* f[i] = max(f[j]) + 1, 0=< j < i
* 3.边界问题
* 位置0元素结尾的子序列最长为1
* f[0] = 1
* 4.计算顺序
* 由于f[i]需要之前的状态信息,因此采用从小到大计算
* @param nums
* @return
*/
public int lengthOfLIS(int[] nums) {
int n = nums.length;
if(n == 0){
return 0;
}
int[] f = new int[n];
f[0] = 1;
int max = f[0];
for(int i = 1; i < n; i++){
f[i] = 1;
int tmpN = 0;
for(int j = i-1; j >= 0; j--){
if(nums[j] < nums[i] && f[j] > tmpN){
tmpN = f[j];
}
}
f[i] += tmpN;
if(f[i] > max){
max = f[i];
}
}
return max;
}
}
300. 最长上升子序列
最新推荐文章于 2025-04-17 11:34:44 发布