1. 程式人生 > >Leetcode 300 Longest Increasing Subsequence 最長遞增子序列

Leetcode 300 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?
題意很清楚,就是求最長遞增子序列,要求複雜度為O(n2)或者更好為O(n log n)。一種解法是轉換為最長路徑問題,i< j , 且nums[i]< nums[j]則看做是從i,到j有一條路徑。然後用動態規劃的思想,狀態轉移方程虛擬碼如下:(這裡的邊只可能是從前指向後的,所以可以使用動態規劃,而不是遞迴,親測遞迴會超時)

for j=1,2,3....n
    L(j
)=1+max(L(i):(i,j)∈E) return max L(j)

下面是正確解法:


class Solution {
public:
    int n;

    int lengthOfLIS(vector<int>& nums) {
        vector<vector<int>> map(nums.size(), vector<int>(nums.size(),0));
        n = nums.size();
        if (n == 0) {
            return 0;
        }
        int
max = 1; for (int i = 0; i < nums.size(); i++) { for (int j = i; j < nums.size(); j++) { if (nums[i] < nums[j]) { map[i][j] = 1; } } } vector<int> dp(n,1); for (int i = 1; i < nums.size(); i++) { int maxpre = 1; for (int j = 0; j < i; j++) { if (map[j][i] == 1&&dp[j]+1>maxpre) { maxpre = dp[j] + 1; } } dp[i] = maxpre; if (dp[i] > max) { max = dp[i]; } } return max; } };