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つのセットが必要であり、スペースを大幅に浪費し、時間にも一定の影響を与えるためです。
一般的には暴力の方がいいのですが、他のコードを書く理由は自分の考えを広げて自分の欠点を補うためです。結局、問題解決策を書く過程で、引き算の機能や交差点。損失はまったくありません。