LeetCode [3-繰り返しのない最も長い文字列] LeetCode [4-順序付けされた配列の中央値]

繰り返しのない最長の文字列

タイトルの説明

文字列を指定して、繰り返し文字を含まない最長の部分文字列の長さを見つけてください。
ここに画像の説明を挿入

問題解決のアイデア

この質問を見ると、実際には、文字列をトラバースして現在の文字が繰り返されているかどうかを記録する2つのステップがあります。
繰り返しの一般的な解決策はハッシュです。これは、ここでは配列で表されます。
ここで見つかった最長の文字列はスライディングウィンドウです。ここでは、左境界用と右境界用の2つの添え字を使用しています。
初期値はleft = 0およびright = -1です。
スライディングウィンドウのスライドは、右の境界線が拡大し、左の境界線が縮小します。
例として、abcabcbbを取り上げます。

  1. 最初に右境界を展開して、右+ <s.size()があるかどうかを確認し、次にハッシュテーブルで現在の文字aが繰り返されているかどうかを確認しますcount [s [right + 1]] == 0そうでない場合は、count [s [++右]] ++;右の境界を拡大できること、およびマークaが繰り返されていること
  2. 最初のステップが完了したら、right = 0、left = 0、上記のステップを繰り返し、right + 1 <size && count [s [right + 1]] == 0と判断し、成功後にbを繰り返さず、右の境界を右に拡張しますあ
  3. 2番目のステップが完了したら、right = 1、left = 0、そして上記のステップを繰り返して、rihgt + 1 <size && count [s [right + 1]] == 0を決定します。cは繰り返されず、右の境界が右に1つ拡張されます
  4. 3番目の部分が完了した後、right = 2、left = 0、および上記の手順を繰り返し、right + 1 <size && count [s [right + 1]] == 0と判断します。このとき、aと判断され、次に[s [left ++ ]]-、左のボーダーを絞り込み、ハッシュの値を変更します
  5. 今後この操作を繰り返す
  6. 各操作では、古いウィンドウのサイズと新しいウィンドウのサイズ(最大(古い、新しい))を比較して、最大値を見つける必要があります。

コードの実装

class Solution {
public:
    int lengthOfLongestSubstring(string s) {
        int count[256] = {0}; //哈希
        int right = -1; //右边界
        int left = 0;//左边界
        int res = 0; //窗口大小
        while(left<s.size())
        {
            if(right+1<s.size()&&count[s[right+1]] == 0)
                count[s[++right]] ++;
            else
                count[s[left++]]--;
            res = max(res,right-left+1);
        }
        return res;
    }
};

順序付けられた配列の中央値

タイトルの説明

サイズmとnの2つの順序付けられた配列が与えられた場合、nums1とnums2。

これらの2つの順序付けられた配列の中央値を見つけて、アルゴリズムの時間の複雑さをO(log(m + n))にする必要があります。

nums1とnums2が同時に空にならないと想定できます。

ここに画像の説明を挿入

問題解決のアイデア

すべてのデータ構造の中央値は2つの関数で解決できます。これは、オファーのデータストリームの中央値の中央値という考え方です。

コードの実装

class Solution {
    priority_queue<int,vector<int>,less<int>> max;
    priority_queue<int,vector<int>,greater<int>> min;
public:
    void Insert(int num)
    {
        if(max.empty() || num<= max.top())
            max.push(num);
        else
            min.push(num);
        
        //保证两个堆的元素个数之差小于1
        if(max.size() == min.size()+2)
        {
            min.push(max.top());
            max.pop();
        }
        if(max.size()+1 == min.size())
        {
            max.push(min.top()); 
            min.pop();
        }
    }
    double GetMedian()
    { 
        return max.size() == min.size() ? (max.top()+min.top())/2.0 : max.top();
    }
    double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) {
        for(int i = 0; i<nums1.size();++i)
        {
            Insert(nums1[i]);
        }
        for(int i = 0;i<nums2.size();++i)
        {
            Insert(nums2[i]);
        }
        double res =GetMedian();
        return res;
    }
};
253件の元の記事を公開しました 賞賛されました41 40,000回以上の閲覧

おすすめ

転載: blog.csdn.net/liuyuchen282828/article/details/104540672