[LintCode] Longest Increasing Subsequence 最長遞增子序列


 

Given a sequence of integers, find the longest increasing subsequence (LIS).

You code should return the length of the LIS.

Have you met this question in a real interview?

 
 
Example

For [5, 4, 1, 2, 3], the LIS  is [1, 2, 3], return 3

For [4, 2, 4, 5, 3, 7], the LIS is [4, 4, 5, 7], return 4

Challenge

Time complexity O(n^2) or O(nlogn)

Clarification

What's the definition of longest increasing subsequence?

    * The longest increasing subsequence problem is to find a subsequence of a given sequence in which the subsequence's elements are in sorted order, lowest to highest, and in which the subsequence is as long as possible. This subsequence is not necessarily contiguous, or unique.  

    * https://en.wikipedia.org/wiki/Longest_common_subsequence_problem

 

我們先來看一種類似Brute Force的方法,這種方法會找出所有的遞增的子序列,並把它們都保存起來,最后再找出里面最長的那個,時間復雜度為O(n2),參見代碼如下:

 

class Solution {
public:
    /**
     * @param nums: The integer array
     * @return: The length of LIS (longest increasing subsequence)
     */
    int longestIncreasingSubsequence(vector<int> nums) {
        vector<vector<int> > solutions;
        longestIncreasingSubsequence(nums, solutions, 0);
        int res = 0;
        for (auto &a : solutions) {
            res = max(res, (int)a.size());
        }
        return res;
    }
    void longestIncreasingSubsequence(vector<int> &nums, vector<vector<int> > &solutions, int curIdx) {
        if (curIdx >= nums.size() || curIdx < 0) return;
        int cur = nums[curIdx];
        vector<int> best_solution;
        for (int i = 0; i < curIdx; ++i) {
            if (nums[i] <= cur) {
                best_solution = seqWithMaxLength(best_solution, solutions[i]);
            }
        }
        vector<int> new_solution = best_solution;
        new_solution.push_back(cur);
        solutions.push_back(new_solution);
        longestIncreasingSubsequence(nums, solutions, curIdx + 1);
    }
    vector<int> seqWithMaxLength(vector<int> &seq1, vector<int> &seq2) {
        if (seq1.empty()) return seq2;
        if (seq2.empty()) return seq1;
        return seq1.size() < seq2.size() ? seq2 : seq1;
    }  
};

 

還有兩種方法,(未完待續。。)

 

參考資料:

http://www.cnblogs.com/lishiblog/p/4190936.html

http://blog.xiaohuahua.org/2015/01/26/lintcode-longest-increasing-subsequence/


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM