旅の目的地への3つの解決策

1436.トラベルターミナル

難易度42

ツアーでは、一連の移動ルートの回路図を表示できますpaths。ここでpaths[i] = [cityAi, cityBi]は、線からの表現cityAiが直接移動しcityBiます。この旅行の目的地、つまり他の都市へのルートがない都市を見つけてください*。*

タイトルデータは、ルートマップがループのないルートを形成することを保証するため、旅行ターミナルは1つだけになります。

例1:

输入:paths = [["London","New York"],["New York","Lima"],["Lima","Sao Paulo"]]
输出:"Sao Paulo" 
解释:从 "London" 出发,最后抵达终点站 "Sao Paulo" 。本次旅行的路线是 "London" -> "New York" -> "Lima" -> "Sao Paulo" 。

例2:

输入:paths = [["B","C"],["D","B"],["C","A"]]
输出:"A"
解释:所有可能的线路是:
"D" -> "B" -> "C" -> "A". 
"B" -> "C" -> "A". 
"C" -> "A". 
"A". 
显然,旅行终点站是 "A" 。

例3:

输入:paths = [["A","Z"]]
输出:"Z"

促す:

  • 1 <= paths.length <= 100
  • paths[i].length == 2
  • 1 <= cityAi.length, cityBi.length <= 10
  • cityAi != cityBi
  • すべての文字列は、大文字と小文字の英字とスペース文字で構成されています。

個人的に書かれた

この質問は難しいことではありませんが、私もしばらく考えましたが(私の頭の中で第一印象はハッシュテーブルですが、それを書く方法がわかりません)、その実際的な暴力を行うことができます。到着場所を判断するすべての開始点が同じであるとは限りません。同じでない限り、到着場所が終了であることを意味します。

class Solution
{
public:
    string destCity(vector<vector<string>> &paths)
    {

        int n = paths.size();

        for (int i = 0; i < n; i++)
        {
            string temp1 = paths[i][1];
            int j;
            for (j = 0; j < n; j++)
            {
                if (temp1 == paths[j][0])
                {
                    break;
                }
            }
            if (j == n)
                return temp1;
        }
        return "";
    }
};

上記は暴力ですが、この方法も考慮する必要があります。

私は当初このO(n 2)の時間計算量はあまり良くないと思っていましたが、

ただし、この方法はすべての問題解決策で非常に高いと考えられており、実行時間とメモリ消費量を上回ったユーザーは90%にもなります。

しかし、他の解決策と知識を追加させてください

他人の問題解決
class Solution {
public:
    string destCity(vector<vector<string>>& paths) {
        unordered_map<string,int>  helper;
        for(auto  p:paths){
            helper[p[0]]+=1;
            helper[p[1]]+=0;
        }
        for(auto  h:helper){
            if(h.second==0){
                return h.first;
            }
        }
        return "";
    }
};

上記のコードのアプローチは、ハッシュテーブルがそれを運ぶために使用され、容量消費が比較的大きいことを除いて、私のアプローチに似ています。

彼の考え:これらの開始点については、すべて+ = 1;(別のレベルから考えると、開始点は1に初期化されます)

そして、それらの到着ポイントについては、すべて+ = 0、(エンドポイントは0に初期化されます)

このように、最後に0とマークされた場所が1つしかない場合は、それが到着ポイントになります。

(上記のコードは、ハッシュテーブルでは解決できない問題を解決します。個人的には、すべての開始点とキーポイントがハッシュテーブルに格納され、0に初期化されると思います。同一のものが1つある限り、直接+1です。最終的にトラバースして答えを見つけると、問題が発生します。最初の開始点と最後の点が1つ(つまり、0とマークされた点)しかないため、それがわからないためです。終点===>ただし、上記のコードはすべての始点が1に初期化され、すべての終点が0に初期化されるため、最初の始点と最後の終点が分離されます。これが、上記を記録した理由です。コード);

3番目のアルゴリズム

始点と終点を2セットにした後、始点セットから終点セットを差し引いた残りの要素が結果(差分セット)==>個人的にはこのような差分セットを習得していません、インターネットでもう一度検索したので、いくつかの情報を整理しました

共通部分、和集合、違い

これらの機能を使用する場合は、並べ替えに注意する必要があります。インターネット上の多くの資料では、これを宣言していません(間違えたときにもわかりました)

元の質問に戻ると、明らかに、このアルゴリズムはここで使用するには不適切すぎます。差分セットを作成するには3つのセットが必要であり、スペースを大幅に浪費し、時間にも一定の影響を与えるためです。


一般的には暴力の方がいいのですが、他のコードを書く理由は自分の考えを広げて自分の欠点を補うためです。結局、問題解決策を書く過程で、引き算の機能や交差点。損失はまったくありません。

おすすめ

転載: blog.csdn.net/weixin_45929885/article/details/114240787