BFSの問題-LeetCode 55,45,5297,127,433,434(BFS)

[LeetCode#55]ジャンピングゲーム

非負整数配列を考えると、あなたは最初に、配列の最初の位置にあります。
配列の各要素は、あなたがその位置にジャンプすることができた最大の長さを表しています。
あなたが最終位置に到達することができるかどうかを判断するには。

実施例1:
入力:[2,3,1,1,4]
出力:真の
説明:我々は、ステップ3から1に達する最後の位置の位置をジャンプ次に、位置0から位置1に、最初のステップをジャンプすることができます。

クラスのソリューション{
パブリック:
ブールcanJump(ベクトル &NUMS){
int型maxReach = NUMS [0]。
以下のために(; I <= maxReach && I <nums.size(); INT iが0 = I ++){
maxReach = MAX(maxReach、I + NUMS [I])。
}
IF(maxReach <nums.size() - 1)、falseを返します。//最远的元素
他trueを返します。
}
};
来源:力扣(LeetCode)
链接: https://leetcode-cn.com/problems/jump-game

[LeetCode#45]ジャンピングゲームII

非負整数配列を考えると、あなたは最初に、配列の最初の位置にあります。
配列の各要素は、あなたがその位置にジャンプすることができた最大の長さを表しています。
あなたの目標は、配列の最後の位置に到達するためのホップの最小数を使用することです。

例:
入力:[2,3,1,1,4]
出力:2

クラスのソリューション{
パブリック:
int型のジャンプ(ベクトル &NUMS){
int型maxReach = 0。
INTステップ= 0。
int型TMP = 0; //保存上次的maxReach
ため(INT I = 0; I <= maxReach && I <nums.size() - 1; I ++){
maxReach = MAX(maxReach、I + NUMS [I])。
IF(I == TMP){
ステップ++。
TMP = maxReach。
}
}
戻りステップと
}
};
来源:力扣(LeetCode)
链接: https://leetcode-cn.com/problems/jump-game-ii

[LeetCode#5297]ジャンパIII

非負の整数の配列arr、あなたが最も配列の開始時にマークの初めに開始するがあります。ARR [i]は-あなたは私がインデックスに位置しているとき、あなたは私には、[I]またはI + ARRをスキップすることができます。
彼らは任意のインデックスの値0の対応する要素にジャンプすることができるかどうかを判断してください。

どのような状況に関係なく、あなたが外配列のジャンプができないことに注意してください。

実施例1:
入力:ARR = [4,2,3,0,3,1,2]、開始 = 5
出力:真
解釈:
インデックス値を到着0は、次の3つの可能性である:
添字5 - >次の標準の4 - >添字1 - > 3下付
添字5 - >添字6 - >添字4 - >添字1 - >添字3

問題解決のアイデア:再帰的なメソッドを使用して中間変数を格納するための配列を使用して、DP

クラスのソリューション{
パブリック:
ブールcanReach(ベクトル &ARR、INTスタート){
ベクトル DP((arr.size)、偽);
リターンDFS(DP、編曲、スタート)。
}
プライベート:
ブールDFS(ベクトル &DP、ベクトル &ARR、INTスタート){
IF(開始<0 ||開始> = arr.size())戻り偽。
場合(DP [スタート] ==偽){
DPは、[スタート] = TRUE;
(ARRが== 0 [開始])があればtrueを返します。
戻りDFS(DP、ARR、開始ARR [開始])|| DFS(DP、ARR、[開始] + ARR開始)。
}それ以外の
リターンはfalse;
}
};
来源:力扣(LeetCode)
链接: https://leetcode-cn.com/problems/jump-game-iii

[LeetCode#127]ワードソリティア

最短endWord beginWordから変換シーケンスの長さを見つけるために、二つの単語(beginWordとendWord)と辞書を、与えられました。変換は、次の規則に従う必要があります。

各変換は、唯一の文字を変更することができます。
単語の変換プロセスの途中には、辞書にある単語でなければなりません。

問題解決のアイデア:

コード構造から、BFSアルゴリズムを使用して、バイナリツリーは最初の版を初めて目に非常によく似て前のレベルを横断し、非最適化バージョンは、訪問したかどうかをマークするフラグの配列を使用して、通常のBFSアルゴリズムであるが、ここでは、問題があります変換がCanChangeメソッドと呼ばれますが、ワードリスト要素が非常に大きい場合、明らかに、このようなクエリが非常に遅くなることがあります。かどうかを毎回クエリ
このように、第2版、思考の変化は、最初のHashSetを作成し、変更が存在した後、すべての変更の各文字beginWordをチェックする必要があり、その後、HashSetの問合せワード。だから、配列全体を横断して、効率を大幅に改善しません!

(初版、DFSコード間の性能差、一般的な、最適化なし、2000ミリ秒)

クラスのソリューション{
パブリック:
int型ladderLength(文字列beginWord、文字列endWord、ベクトル &wordListに){
キュー その;
que.push(beginWord)。
ベクトル フラグ(wordList.size()+ 1)。
INT層= 1。
(!que.empty()){しばらく
層++;
INTサイズ= que.size()。
一方、(size--){
文字列CUR = que.front()。
que.pop();
以下のために(INT I = 0; I <wordList.size(); I ++){
(フラグ[I])が続く場合、
IF(CanChangeメソッド(CUR、wordListに[I])){
IF(wordListに[I] == endWord)リターン層。
que.push(wordListに[I])。
フラグ[i]は= TRUE。
}
}
}
}
0を返します。
}
プライベート:
BOOL CanChangeメソッド(列A、列B){
int型LEN = a.length()。
INT差分= 0;
のために(INT I = 0、I <lenは、I ++){
差分IF ++(A [I] = B [I]!);
}
差分を返す== 1;
}
};
第2版、HashSetの10倍の高速化、最適化した後、100ミリ秒)

クラスのソリューション{
パブリック:
int型ladderLength(文字列beginWord、文字列endWord、ベクトル &wordListに){
int型のステップ= 0。
キュー QUE;
unordered_set HashSetの(wordList.begin()、wordList.end());
IF(hashset.count(endWord)!の)リターン0;
que.push(beginWord);
int型のlen = beginWord.length(); //辞書同じLEN
{一方(que.empty()!)
STEP ++; // BFSは、++層ステップトラバースされ
、int型のサイズ= que.size()
一方、(size--){
文字列que.front CUR =();
que.pop( );
のための(INT I = 0; I <LEN; I ++){
チャーC = CUR [I]は; //変更するときは、次のバッファ
のための(INT J = '' ; J <= 'Z'、J ++){
(J == c)の場合は、引き続き; //は、 自分自身をスキップ
CUR [I] = J;
IF(CUR == endWord)+ STEPリターン1;
IFは(!hashset.count(CUR))を続行;
hashset.erase(CUR ); //エンド削除アクセス
que.push(CUR)
}
CUR [I] = C; //は、複数の単語であってもよいが、変換後の単語であってもよい
}
}
}
戻り0;
}
};
出所:滞在ボタン(LeetCode)
リンク: HTTPS:// leetcode-CN .COM /問題/ワードはしご

[LeetCode#433]最小限の遺伝的変化は、

配列を有する遺伝子は8つの文字、「A」、「C」に属する前記各文字の文字列で表される 、 「T」、「G」のいずれか。
我々は遺伝子配列の変化を調査するとします。文字の順序が変更されました。この遺伝子手段の遺伝的変異。
例えば、「AACCGGTA」への遺伝子配列「AACCGGTT」に変化する、すなわち、遺伝的変異がありました。

同時に、各時間遺伝的変化の結果では、我々は結果は遺伝子バンクに属し、ある遺伝子の合法的な文字列を、必要とします。
今、与えられた三つのパラメータ-開始、終了、銀行、開始遺伝子配列を表す、標的遺伝子配列と遺伝子ライブラリー、開始遺伝子配列を見つけるためには、標的遺伝子配列の最小必要数を変更するために変更することができます。あなたは目標の変化を達成することができない場合は、-1を返します。

問題解決のアイデア:

ここでは前のトピックやアイデア、ちょうど異なるいくつかの小さなと一致し、唯一の最適化プログラムの後に与えられています。

クラスのソリューション{
パブリック:
int型minMutation(文字列の先頭、文字列の末尾、ベクトル &銀行){
キュー QUE;
unordered_set HashSetの(bank.begin()、bank.end())。
(もし!hashset.count(終了))リターン-1;
hashset.erase(スタート)。
hashset.erase(エンド)。
int型のlen = 8; // 8个
文字列の配列= "ACGT"。
INTステップ= 0。
que.push(スタート)。
(!que.empty()){ながら、
ステップ++;
INTサイズ= que.size()。
一方、(size--){
文字列CUR = que.front()。
que.pop();
以下のために(INT I 0 =; I <8; I ++){
チャーCH = CUR [I]。
(自動J:配列)のための{
(j == CH)が続けば、
[I] = jのCUR。
IF(CUR ==端)リターンステップと //返回变化次数
(hashset.count(CUR)が!)続けば、
hashset.erase(CUR);
que.push(CUR)
}
CUR [I] = CH; //復元
}
}
}
戻り-1;
}
};
出所:滞在ボタン(LeetCode)
リンク: https://でleetcode- cn.com/problems/minimum-genetic-mutation

[LeetCode#434]の文字列内の単語の数

文字列内の単語の数をカウントし、ここでの言葉は、連続的な文字が空白ではないに言及します。
あなたは、文字列を任意の非印字文字が含まれていないことを前提としていたことに注意してください。

例:
入力:「こんにちは、私の名前はジョンである 」
出力:5

クラス解決{
パブリック:
int型countSegments(文字列s){
I 0 = INT。
一方、(I <s.length()&& S [I] == '「)は、i ++;
もし(I == s.length())の戻り0;
int型のres = 0;
一方、(I <s.length()){
ながら(!I <s.length()&& S [I] = '「)は、i ++;
解像度++;
一方、(I <s.length()&& S [I] == '「)は、i ++;
}
RESを返します。
}
}。

おすすめ

転載: www.cnblogs.com/niaocaizhou/p/12129406.html