题解 | #最长上升子序列(一)#
最长上升子序列(一)
https://www.nowcoder.com/practice/5164f38b67f846fb8699e9352695cd2f
当看完这题没有思路,不知如何入手时,需要自己设置一个合理的数组
最好的方法是动手去把以每一个位置为结尾的最长递增子序列写出来,在写的过程中就会发现规律
- 第一层遍历从前往后遍历数组,计算以每一个位置为结尾的最长递增子序列的长度
- 第二层遍历,遍历该位置之前的所有位置的最长递增子序列,若当前位置的数字较大,则可以构成一个新的递增子序列
- 在所有新的递增子序列中选择长度最长的作为该位置的最长递增子序列的长度
如何判断这是一个动态规划问题
最优子结构:当前位置的最长递增子序列的长度,实在前面所有位置的最长递增子序列的长度的基础上的出来的,即当前位置的最优包含的之前所有位置的最优
重叠问题:每个位置的解都会被之后位置重复利用,使用dp数组存储起来
求出以每一个位置为结尾的最长递增子序列长度后,取最大值就是该数组的最长递增子序列长度
import java.util.*; public class Solution { /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * 给定数组的最长严格上升子序列的长度。 * @param arr int整型一维数组 给定的数组 * @return int整型 */ public int LIS (int[] arr) { // write code here if(arr.length == 0) { return 0; } int[] dp = new int[arr.length]; for(int i=0;i<dp.length;i++) { dp[i] =1; } for(int i=0;i<dp.length;i++) { for(int j=0;j<i;j++) { if(arr[j] < arr[i]) dp[i] = Math.max(dp[i],dp[j]+1); } } Arrays.sort(dp); return dp[dp.length-1]; } }