Leetcode_300_最长上升子序列
2019-05-06 15:27
148 查看
题目描述:给定一个无序的整数数组,找到其中最长上升子序列的长度。
示例:
输入: [10,9,2,5,3,7,101,18] 输出: 4 解释: 最长的上升子序列是 [2,3,7,101],它的长度是 4。
算法思想:题目要求最长的上升序列,需要设置一个dp[]数组,用来记录最终的结果长度,dp[i]表示包含的序列最后一个元素是nums[i]的长度。dp[i]取值只有两种情况,第一种情况:当前面的元素都没有当前nums[i]元素值小,则dp[i]=1,即只包含自身元素,长度就是1。第二种情况:当前面存在比nums[i]小的元素,就将当前nums[i]添加到比nums[i]小的元素后面,dp[i]=dp[i]+1。
具体做法:初始化dp数组,dp[i]=1,ans=-1用于返回最大递增长度,当nums[i]>nums[j]时,并且dp[i]<dp[j]+1时,就更新dp[i]=dp[j]+1,计算出一个dp[i],就更新一下ans,ans=max(ans,dp[i]),最终ans就是最大递增子序列长度
i
代码实现:
class Solution { public: int lengthOfLIS(vector<int>& nums) { int length=nums.size(); if(length==0) return 0; int dp[length]; for(int i=0;i<length;i++){ dp[i]=1;//边界 } int ans=-1; for(int i=0;i<length;i++){ for(int j=0;j<i;j++){ if(nums[i]>nums[j]&&(dp[i]<dp[j]+1)){ dp[i]=dp[j]+1; } } ans=max(ans,dp[i]); } return ans; } };
相关文章推荐
- Leetcode 300:最长上升子序列
- LeetCode300 最长上升子序列
- (Java) LeetCode 300. Longest Increasing Subsequence —— 最长上升子序列
- Leetcode 300 Longest Increasing Subsequence 最长递增子序列
- Leetcod-300_最长上升子序列LIS-基础动态规划问题-【C++】
- Leetcode 300. 最长上升子序列
- leetcode(300)—— Longest Increasing Subsequence(最长递增子序列)
- 【LeetCode 300 Longest Increasing Subsequence】最长递增子序列
- 最长公共上升子序列的另一个O(mn)的算法
- 【北大夏令营笔记-动态规划】百练2757-最长上升子序列
- O(nlogn)最长上升子序列
- hdu1160-最长上升子序列
- 动态规划----最长上升子序列问题
- [学习笔记]浅谈LIS(最长上升子序列)与网络流
- YTU OJ 3135: 动态规划基础题目之最长上升子序列(Java解题)
- hdu 5489 Removed Interval 动态规划,最长上升子序列
- nyoj+矩形嵌套,自己做的最长上升子序列+小白上时DAG最长路
- codevs-3955 最长不上升子序列
- c++动态规划基础——最长上升子序列
- 最长上升子序列 POJ 2533(n*n与 nlogn)