Longest Increasing Subsequence的两种算法
2015-11-04 21:35
393 查看
问题描述:给出一个序列a1,a2,a3,a4,a5,a6,a7….an,求它的一个子序列(设为s1,s2,…sn),使得这个子序列满足这样的性质,s1<s2<s3<…<sn并且这个子序列的长度最长。简称LIS。
例如,对于数组
1.时间复杂度:O(n^2)
对于序列A(a1,a2,a3…..an),以序列中am元素为最小值的递增序列,只与am-1,am-2,……an有关,与am之前的元素无关,因此我们可以由后向前依次求出以每个元素为起始的最长递增序列。我们用一个数组flag存储最长递增子序列的长度,若i<j,A[i] < A[j],则flag[i] = max(flag[x], j <= x <= A.length) + 1。
2.时间复杂度O(nlogN)
我们定义一个数组dp[],dp[i]表示长度为i的序列中最小的元素的值。例如对于序列A
例如,对于数组
[10, 9, 2, 5, 3, 7, 101, 18],它的最长递增子序列为[2,3,7,101],长度为4。当然最长递增子序列不止一个,例如[2,5,7,101],[2,5,7,18]都符合要求。
1.时间复杂度:O(n^2)
对于序列A(a1,a2,a3…..an),以序列中am元素为最小值的递增序列,只与am-1,am-2,……an有关,与am之前的元素无关,因此我们可以由后向前依次求出以每个元素为起始的最长递增序列。我们用一个数组flag存储最长递增子序列的长度,若i<j,A[i] < A[j],则flag[i] = max(flag[x], j <= x <= A.length) + 1。
public int lengthOfLIS(int[] nums) {
if (nums == null || nums.length == 0)
return 0;
int[] flag = new int[nums.length];
Arrays.fill(flag,1);
int maxLength = 1;
for (int i =nums.length - 2; i >= 0; i--){
int maxTemp = flag[i];
for (int j = i+1; j < nums.length;j++){
if (nums[i] < nums[j]){
maxTemp = maxTemp > flag[j] + 1 ? maxTemp : flag[j] + 1;
}
}
flag[i] = maxTemp;
maxLength = maxLength > flag[i] ? maxLength: flag[i];
}
return maxLength;
}
2.时间复杂度O(nlogN)
我们定义一个数组dp[],dp[i]表示长度为i的序列中最小的元素的值。例如对于序列A
[10, 9, 2, 5, 3, 7, 101, 18],我们依次扫描每个元素,
首先对于A[0] = 10 , 我们可以得dp[1] = 10 ,表示序列长度为1的最小元素为10,此时序列为10,
对于A[1] = 9, 因为A[1] < dp[1],所以dp[1] = 9,此时序列为9
对于A[2] = 2, 因为A[2] < dp[1],所以dp[1] = 2,此时序列为2
对于A[3] = 5, 因为A[3] > dp[1],所以dp[2] = 5,此时序列为2,5
对于A[4] = 3, 因为A[4] < dp[2],所以dp[2] = 3,此时序列为2,3
对于A[5] = 7, 因为A[5] > dp[2],所以dp[3] = 7,此时序列为2,3,7
对于A[6] = 101, 因为A[6] > dp[3],所以dp[3] = 101,此时序列为2,3,7,101
对于A[7] = 18, 因为A[7] < dp[3],所以dp[3] = 18,此时序列为2,5,7,18
所以最长递增子序列的长度为4
int[] dp = new int[nums.length];
int len = 0;
for(int x : nums) {
int i = Arrays.binarySearch(dp, 0, len, x);
if(i < 0) i = -(i + 1);
dp[i] = x;
if(i == len) len++;
}
return len;
相关文章推荐
- 2015ACM/ICPC亚洲区长春站 L hdu 5538 House Building
- iOS开发小技巧:刷新UITableView
- UIview的一些基本方法
- XMPP框架 微信项目开发之Socket聊天室发送数据——获取键盘高度,修改控件的约束值,代码滚动UITabView到指定位置
- uiautomator使用
- Qt中用户界面的User Interface Compiler(uic)机制的相关说明
- UE激活
- CYC-UISearchBar 点击空白回收键盘
- UILabel自动适应尺寸
- LeetCode300——Longest Increasing Subsequence
- 2015ACM/ICPC亚洲区长春站 E hdu 5531 Rebuild
- hdu1005 Number Sequence
- BLE UUID
- iOS求生之路(四)UICollectionView的用法
- hdoj--1171--Number Sequence(KMP)
- hdoj--1171--Number Sequence(KMP)
- 修改IOS中UISearchBar的取消按钮背景、搜索内容输入文本框背景和UISearchBar的背景
- 《iOS Human Interface Guidelines》——Interactivity and Feedback
- 反射访问属性或方法时将Accessible设置为true
- UIView 实例方法 Instance Methods(转)