Longest Increasing Subsequence

#include <iostream>
#include <vector>
using namespace std;

class Solution {
public:
    int longestIncreasingSubsequence(vector<int>& nums) {
        vector<int> LIS (nums.size(), 0);
        vector<int> LISPrevious (nums.size(), -1);
        int max = 0;
        int end = -1;
        for (unsigned int i = 0; i < nums.size(); i++) {
            LIS[i] = 1;
            for (unsigned int j = 0; j < i; j++) {
                if ((LIS[j] + 1) > LIS[i]) {
                    if (nums[j] < nums[i]) {
                        LIS[i]         = LIS[j] + 1;
                        LISPrevious[i] = j;
                    }
                }
            }
            if (LIS[i] > max) {
                max = LIS[i];
                end = i;
            }
        }
/*for DBG*/
#if 0
        for (int i = 0; i < nums.size(); i++) {
            cout << LIS[i] << ", " << LISPrevious[i] << "\n";
        }
#endif
        cout << "max = " << max << "\n";
        if (max != 0) {
            while (--max > 0) {
                cout << nums[end] << ", ";
                end = LISPrevious[end];
            }
            cout << nums[end] << "\n\n";
        }
        return max;
    }
};

int main()
{
    int myints[] = {50, 3, 10, 7, 40, 80};
    std::vector<int> test (myints, myints + sizeof(myints) / sizeof(int) );
    std::vector<int> none;

    Solution solution;
    solution.longestIncreasingSubsequence(test);
    solution.longestIncreasingSubsequence(none);
    return 1;
}

留言

這個網誌中的熱門文章

https://leetcode.com/contest/leetcode-weekly-contest-52/problems/longest-univalue-path/

https://leetcode.com/contest/leetcode-weekly-contest-52/problems/maximum-sum-of-3-non-overlapping-subarrays/