【暴力】LeetCode 300. Longest Increasing Subsequence

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Allenlzcoder/article/details/81417420

LeetCode 300. Longest Increasing Subsequence

Solution1:我的答案
暴力搜索,时间复杂度 O ( n 2 )

class Solution {
public:
    int lengthOfLIS(vector<int>& nums) {
        int n = nums.size(), res = 1;
        if (!n) return 0;
        if (n == 1) return 1;
        //注意:这种对数组初始化的方式只会初始化第一个为1
        int dp[n] = {1};
        for (int i = 1; i < n; i++) {
            dp[i] = 1;
            for (int j = 0; j < i; j++) {
                if (nums[i] > nums[j]) {
                    dp[i] = max(dp[i], dp[j] + 1);
                } 
            }
            res = max(dp[i], res);
        }
        return res;
    }
};

Solution2:
时间复杂度 O ( n l o g n )
参考链接:[1]http://www.cnblogs.com/grandyang/p/4938187.html
[2]https://leetcode.com/problems/longest-increasing-subsequence/discuss/148060/Easy-To-Understand-Python-Code-With-Clear-Explanation-O(nlogn)
一个有点奇妙的算法~

class Solution {
public:
    int lengthOfLIS(vector<int>& nums) {
        vector<int> dp;
        for (int i = 0; i < nums.size(); ++i) {
            int left = 0, right = dp.size();
            while (left < right) {
                int mid = left + (right - left) / 2;
                if (dp[mid] < nums[i]) left = mid + 1;
                else right = mid;
            }
            if (right >= dp.size()) dp.push_back(nums[i]);
            else dp[right] = nums[i];
        }
        return dp.size();
    }
};

猜你喜欢

转载自blog.csdn.net/Allenlzcoder/article/details/81417420