LIS

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(n^2) $$ complexity.

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

(1)动态规划的算法

class Solution {
public:
    int lengthOfLIS(vector<int>& nums) {
        if(nums.empty()) return 0;
        vector<int> res(nums.size(), 1);

        int maxLen = 1;
        for(int j = 1; j < nums.size(); ++j){
            for(int i = 0; i < j; ++i){
                if(res[j] < res[i] + 1 && nums[j] > nums[i])
                    res[j] = res[i] + 1;
            }
            maxLen = max(res[j], maxLen);
        }
        return maxLen;
    }
};

(2)运用二分,时间复杂度$$O(nlogn)$$

class Solution {
public:
    int lengthOfLIS(vector<int>& nums){
        if(nums.empty())    return 0;

        vector<int> res;

        for(auto num:nums){
            auto it = lower_bound(res.begin(), res.end(), num);

            if(it == res.end())  
                res.push_back(num);
            else                    
                *it = num;
        }
        return res.size();
    }
};

334. Increasing Triplet Subsequence

Given an unsorted array return whether an increasing subsequence of length 3 exists or not in the array.

Formally the function should: Return true if there exists i, j, k such that arr[i] < arr[j] < arr[k] given 0 ≤ i < j < k ≤ n-1 else return false. Your algorithm should run in O(n) time complexity and O(1) space complexity.

Examples: Given [1, 2, 3, 4, 5], return true.

Given [5, 4, 3, 2, 1], return false.

(1)解法一:求出LIS,判断长度是否大于3

(2)解法二:

class Solution {
public:
    bool increasingTriplet(vector<int>& nums) {
        int min = INT_MAX;
        int mid = INT_MAX;

        for(auto num:nums){
            if(num < min)
                min = num;
            else if(num > min){
                if(num > mid)
                    return true;
                else
                    mid = num;
            }
        }
        return false;
    }
};

results matching ""

    No results matching ""