トピックは、アドレス
あなたが最も配列の開始時にマークの初めに開始し、非負の整数の配列arrがあります。ARR [i]は-あなたは私がインデックスに位置しているとき、あなたは私には、[I]またはI + ARRをスキップすることができます。
彼らは任意のインデックスの値0の対応する要素にジャンプすることができるかどうかを判断してください。
どのような状況に関係なく、あなたが外配列のジャンプができないことに注意してください。
例1:
入力:ARR = [4,2,3,0,3,1,2]、開始 = 5
出力:真の
解釈は:
インデックス値0は、次の3つの可能性である到着:
- >添字4添字5 - >添字1 - > 3下付
添字5 - >添字6 - >添字4 - >添字1 - >添字3
実施例2:
入力:ARR = [4,2,3,0,3,1,2]、開始 = 0
出力:真の
解釈は:
インデックス値0は、次の3つの可能性である到着:
- >添字4添字0 - >添字1 - >添字3
例3:
入力:ARR = [3,0,2,1,2]、開始 = 2
出力:偽
の解釈:1がゼロのインデックス値に到達することはできませんが。
出典:滞在ボタン(LeetCode)
//leetcode-cn.com/problems/jump-game-iii:リンク:httpsの
すべてのネットワークからの控除が著作権を保有。商業転載は、ソースを明記してください許可公式、非商用の転載をご連絡ください。
DFSバージョン:
思考:
状況についての選択肢に直面したとき、我々は2例が記録されていて、その後、記録されているすべてのコンテンツのために一つ一つを継続しようとし続けますが、必要な状況サイクルに注意を払うへ。
選択の周りの状況に遭遇した場合、最初のリサイクルの発生が再選択上の点を選択するように後退するまで、この道に沿って継続し、その後、方向を選択します。
出典:滞在ボタン(LeetCode)
著者によって予約の著作権。著者は認可商業転載してください接触、非商用の転載は、ソースを明記してください。
const int MAXN = 5*1e4+50;
bool vis[MAXN];
class Solution {
public:
bool DFS(int index,vector<int> & arr){
if(arr[index] == 0) return true;
vis[index] = true;//这里进行标记:
/*
例如:[4,2,3,0,3,1,2] 我们从 5 出发,这时 a[5] != 0 ,标记为true,
之后再到这里的时候就不用访问(构成环了)
下面是左右DFS遍历
*/
int x1 = index+arr[index],x2 = index-arr[index],len = arr.size();
bool flag = false;
if(x1>=0&&x1<len&&vis[x1]==false) flag+= DFS(x1,arr);
if(x2>=0&&x2<len&&vis[x2]==false) flag+= DFS(x2,arr);
return flag;
}
bool canReach(vector<int>& arr, int start) {
memset(vis,0,sizeof vis);
return DFS(start,arr);
}
};
BFSバージョン:
アイデア:
要素の値を、対応する一つの位置が0であれば我々は幅優先使用することができ、検索位置を開始するために最初から取得するすべての方法は、真を返し、その後、到達することができます。
具体的には、キューに参加し、当初開始します。ARR [U] - 検索処理のそれぞれにおいて、我々はそれがU + ARR [U]およびuのために到達することができるキューノードUの頭部を取り除きます。位置は、配列の添字範囲[0、LEN(ARR))内を落下し、次いで、尾の位置を添加した検索されなかった場合。限り、我々は0対応する要素位置の値を検索として、我々はTrueを返します。位置がまだ要件を満たすために見つからない場合は、検索の終わりに、我々はFalseを返します。
class Solution {
public:
bool canReach(vector<int>& arr, int start) {
if (arr[start] == 0) {
return true;
}
int n = arr.size();
vector<bool> used(n);
queue<int> q;
q.push(start);
used[start] = true;
while (!q.empty()) {
int u = q.front();
q.pop();
if (u + arr[u] < n && !used[u + arr[u]]) {
if (arr[u + arr[u]] == 0) {
return true;
}
q.push(u + arr[u]);
used[u + arr[u]] = true;
}
if (u - arr[u] >= 0 && !used[u - arr[u]]) {
if (arr[u - arr[u]] == 0) {
return true;
}
q.push(u - arr[u]);
used[u - arr[u]] = true;
}
}
return false;
}
};
著者:LeetCodeの
リンクします。https://leetcode-cn.com/problems/jump-game-iii/solution/tiao-yue-you-xi-iii-by-leetcode/
出典:滞在ボタン(LeetCode)
著者によって予約の著作権。著者は認可商業転載してください接触、非商用の転載は、ソースを明記してください。