LeetCode300-最长上升子序列

    技术2022-07-12  78

    给定一个无序的整数数组,找到其中最长上升子序列的长度。

    示例:

    输入: [10,9,2,5,3,7,101,18] 输出: 4 解释: 最长的上升子序列是 [2,3,7,101],它的长度是 4。

    来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/longest-increasing-subsequence 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

    public int lengthOfLIS(int[] nums) { if(nums == null || nums.length == 0){ return 0 ; } int[] dp = new int[nums.length]; int index = 0 ; for(int i=0 ; i<nums.length ; i++){ if(index == 0){ dp[index] = nums[i] ; index++ ; }else{ if(nums[i] > dp[index-1]){ dp[index] = nums[i] ; index++ ; }else{ int j = 0 ; for(j=index-1 ; j>=0 ;j--){ if(dp[j] < nums[i]){ break ; } } j++ ; dp[j] = nums[i] ; } } } return index ; }

    i位置代表的状态 dp[i]代表着 0-i 位置的最长子序列的末尾元素的最小值。

    [10,9,2,5,3,7,101,18] 举例 j = 0 :[10] //最长子序列长度为1 j = 1 :[9] //为什么是9?因为9<10,所以最长子序列还为1,并且i位置代表着最长子序列末尾元素的最小值。 j = 2 :[2] // 略 j = 3 :[2,5] //这时候最长子序列为2 j = 4 :[2,3] //3取代了5的位置 ······· 简述一下:当前位置的num如果小于dp的最后一个元素,则覆盖dp。覆盖的原则是当dp[i]<num<=dp[i+1]时,dp[i+1] = num 。

    Processed: 0.009, SQL: 9