您的位置:首页 > 产品设计 > UI/UE

[leetcode] 300. Longest Increasing Subsequence 解题报告

2015-12-23 10:52 495 查看
题目链接:https://leetcode.com/problems/longest-increasing-subsequence/

Given an unsorted array of integers, find the length of longest increasing subsequence.

For example,

Given
[10, 9, 2, 5, 3, 7, 101, 18]
,

The longest increasing subsequence is
[2, 3, 7, 101]
, therefore the length is
4
.
Note that there may be more than one LIS combination, it is only necessary for you to return the length.

Your algorithm should run in O(n2) complexity.

Follow up: Could you improve it to O(n log n) time complexity?

思路:借助一个数组hash[],记录每一个位置最长的序列是多长。在每一个位置i向左遍历,直到在位置j找到一个比他小的数,然后状态转移方程就为:hash[i] = hash[j] + 1;

代码如下:

增加一个辅助数组table[],用于维护一个当前最长的递增序列。为维持一个最长的递增序列,我们需要让每一个位置的值都尽可能小。

对于数组中的每一个值nums[i] ,会有两种可能性:

1. 如果nums[i]
> table[len-1],则加入到序列中依然递增,因此将nums[i]加入到序列中,序列长度加1

2. 如果nums[i] < table[len-1], 则说明在序列中的一个位置的最小值可以被更新,因此二分查找table中第一个比nums[i]大的数,用nums[i]替代他

以[10,
9, 2, 5, 3, 7, 101, 18]为例,看看递增序列的增长

1)10

2)9

3)2

4)2, 5

5)2, 3

6)2, 3, 7

7)2, 3, 7,101

8)2, 3, 7, 18

代码如下:

class Solution {
public:
int lengthOfLIS(vector<int>& nums) {
if(nums.size() ==0) return 0;
vector<int> vec;
for(int i =0; i< nums.size(); i++)
{
if(i==0 || nums[i]> vec.back()) vec.push_back(nums[i]);
else
{
int left = 0, right = vec.size()-1;
while(left <= right)
{
int mid = (left+right)/2;
if(vec[mid] < nums[i]) left= mid+1;
else right = mid-1;
}
vec[left] = nums[i];
}
}
return vec.size();
}
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: