标签:进一步 ges etc 解释 ppt int turn length 输入
https://leetcode-cn.com/problems/longest-increasing-subsequence/
给定一个无序的整数数组,找到其中最长上升子序列的长度。
示例:
输入: [10,9,2,5,3,7,101,18]
输出: 4
解释: 最长的上升子序列是 [2,3,7,101],它的长度是 4。
说明:
可能会有多种最长上升子序列的组合,你只需要输出对应的长度即可。
你算法的时间复杂度应该为 O(n2) 。
进阶: 你能将算法的时间复杂度降低到 O(n log n) 吗?
(1)定义状态:
? 假设数组是 nums, [10, 2, 2, 5, 1, 7, 101, 18]
?dp(i) 是以 nums[i] 结尾的最长上升子序列的长度,i ∈ [0, nums.length)
? 以 nums[0] 10 结尾的最长上升子序列是 10,所以 dp(0) = 1
? 以 nums[1] 2 结尾的最长上升子序列是 2,所以 dp(1) = 1
? 以 nums[2] 2 结尾的最长上升子序列是 2,所以 dp(2) = 1
? 以 nums[3] 5 结尾的最长上升子序列是 2、5,所以 dp(3) = dp(1) + 1 = dp(2) + 1 = 2
? 以 nums[4] 1 结尾的最长上升子序列是 1,所以 dp(4) = 1
? 以 nums[5] 7 结尾的最长上升子序列是 2、5、7,所以 dp(5) = dp(3) + 1 = 3
? 以 nums[6] 101 结尾的最长上升子序列是 2、5、7、101,所以 dp(6) = dp(5) + 1 = 4
? 以 nums[7] 18 结尾的最长上升子序列是 2、5、7、18,所以 dp(7) = dp(5) + 1 = 4
? 最长上升子序列的长度是所有 dp(i) 中的最大值 max { dp(i) },i ∈ [0, nums.length)
? 遍历 j ∈ [0, i)
?当 nums[i] > nums[j]
? nums[i] 可以接在 nums[j] 后面,形成一个比 dp(j) 更长的上升子序列,长度为 dp(j) + 1
? dp(i) = max { dp(i), dp(j) + 1 }
?当 nums[i] ≤ nums[j]
? nums[i] 不能接在 nums[j] 后面,跳过此次遍历(continue)
? 状态的初始值
?dp(0) = 1
?所有的 dp(i) 默认都初始化为 1
class Solution { public int lengthOfLIS(int[] nums) { if (nums == null || nums.length == 0) { return 0; } int[] dp = new int[nums.length]; int max = dp[0] = 1; for (int i = 1; i < nums.length; i++) { dp[i] = 1; //需要遍历之前所有元素进行比较 for (int j = 0; j < i; j++) { //若nums[i]<nums[i-1],没法拼接,只要大于的 if (nums[i] <= nums[j]) continue; dp[i] = Math.max(dp[i], dp[j] + 1); } max = Math.max(dp[i], max); } return max; } }
还可以进一步优化,见ppt
标签:进一步 ges etc 解释 ppt int turn length 输入
原文地址:https://www.cnblogs.com/guoyu1/p/13340873.html