leetcode 300注最長の上昇シーケンス

タイトルリンク
最長のサブシーケンスの長さを求める指定された整数配列障害には、増加しました。

例:

输入: [10,9,2,5,3,7,101,18]
输出: 4 
解释: 最长的上升子序列是 [2,3,7,101],它的长度是 4

注:
最長上昇シーケンスの様々な組み合わせがあるかもしれない、あなただけの出力に対応する長さを必要とします。
あなたのアルゴリズムの時間計算量はO(N2)でなければなりません。
高度:あなたは、アルゴリズムの時間の複雑さを軽減することができますO(N Nログ)ですか?

初期の考え:

最初から、または開始の端から動的プログラミングの概念を偏向、各位置に対応する最長の記録シーケンス番号を増やします。
図10は、例えば、配列の立ち上がりで、1,9 1,5 1 2すなわち2、3 2であるものです。
一つは、このアルゴリズムはO(nlogn)で感じるようになったし、私は思った、NUMSベクトルどこ新しいトラバーサルの各要素とO(N2)しないで、すべての配列アラインメント、目の前にあるように思われます。このエッセイは、O(N2)に私を許可していません

公式:貪欲 +二分法:

私たちはシーケンスを作成する必要があること、貪欲いわゆるゆっくりできるだけ高くなるので、我々は可能な限り小さく上昇数を加えた最後のシーケンス内のすべての子供ことを願っています。

ここで感じ貪欲は非常に正確ではない記述、及び後おそらく手段を実現-
第五の工程は[0,4,12]によって挿入される[0,8,4,12,2]に公式の例は、[0になります2及び4が0の間であるため、2、12]、その後、4 2を置き換えます。フォローアップを検討するためのいくつかがある場合、仮定は6は、その後、4よりも大きい両方6であり、それが3であれば2つ以上の、そして最大のサブシーケンスは、まだ3ですか?図3は、我々のニーズを満たすために良い方法はありません、その後、[0,4,12] 4未満です。図4は、このように2のより小さな寸法が必要で置き換えます。
数は、シーケンス内の2つの数字の間にある場合には、より大きな番号を交換するためにそれを使用して、部門の両方のサイズ現在の順序を変更するには、だけでなく、フォローアップティムの一定数を確保するためには完璧なソリューションです!

二分法に続いて、何も頭が、これはO(N2)原因O(nlogn)が変更されていないと述べました。

class Solution {
public:
    int lengthOfLIS(vector<int>& nums) {
        int len = 1, n = (int)nums.size();
        if (n == 0) return 0;
        vector<int> d(n + 1, 0);
        d[len] = nums[0];
        for (int i = 1; i < n; ++i) {
            if (nums[i] > d[len]) d[++len] = nums[i];
            else{
                int l = 1, r = len, pos = 0;
                while (l <= r) {
                    int mid = (l + r) >> 1;
                    if (d[mid] < nums[i]) {
                        pos = mid;
                        l = mid + 1;
                    }
                    else r = mid - 1;
                }
                d[pos + 1] = nums[i];
            }
        }
        return len;
    }
};
リリース9件のオリジナルの記事 ウォンの賞賛1 ビュー152

おすすめ

転載: blog.csdn.net/qq_37782336/article/details/104867331