1306 跳躍遊戲 III BFS or DFS

2021-10-02 06:30:38 字數 1381 閱讀 3071

題目位址

這裡有乙個非負整數陣列 arr,你最開始位於該陣列的起始下標 start 處。當你位於下標 i 處時,你可以跳到 i + arr[i] 或者 i - arr[i]。

請你判斷自己是否能夠跳到對應元素值為 0 的 任意 下標處。

注意,不管是什麼情況下,你都無法跳到陣列之外。

示例 1:

輸入:arr = [4,2,3,0,3,1,2], start = 5

輸出:true

解釋:到達值為 0 的下標 3 有以下可能方案:

下標 5 -> 下標 4 -> 下標 1 -> 下標 3

下標 5 -> 下標 6 -> 下標 4 -> 下標 1 -> 下標 3

示例 2:

輸入:arr = [4,2,3,0,3,1,2], start = 0

輸出:true

解釋:到達值為 0 的下標 3 有以下可能方案:

下標 0 -> 下標 4 -> 下標 1 -> 下標 3

示例 3:

輸入:arr = [3,0,2,1,2], start = 2

輸出:false

解釋:無法到達值為 0 的下標 1 處。

const int maxn = 5*1e4+50;

bool vis[maxn];

class solution

};

bfs版本:

思路:我們可以使用廣度優先搜尋的方法得到從 start 開始能夠到達的所有位置,如果其中某個位置對應的元素值為 0,那麼就返回 true。

具體地,我們初始時將 start 加入佇列。在每一次的搜尋過程中,我們取出隊首的節點 u,它可以到達的位置為 u + arr[u] 和 u - arr[u]。如果某個位置落在陣列的下標範圍 [0, len(arr)) 內,並且沒有被搜尋過,則將該位置加入隊尾。只要我們搜尋到乙個對應元素值為 0 的位置,我們就返回 true。在搜尋結束後,如果仍然沒有找到符合要求的位置,我們就返回 false。

class solution 

int n = arr.size();

vectorused(n);

queueq;

q.push(start);

used[start] = true;

while (!q.empty())

q.push(u + arr[u]);

used[u + arr[u]] = true;

}if (u - arr[u] >= 0 && !used[u - arr[u]])

q.push(u - arr[u]);

used[u - arr[u]] = true;}}

return false;

}};

1306 跳躍遊戲 III(C )

這裡有乙個非負整數陣列 arr,你最開始位於該陣列的起始下標 start 處。當你位於下標 i 處時,你可以跳到 i arr i 或者 i arr i 請你判斷自己是否能夠跳到對應元素值為 0 的 任意 下標處。注意,不管是什麼情況下,你都無法跳到陣列之外。示例 1 輸入 arr 4,2,3,0,3...

1306 跳躍遊戲 III

這裡有乙個非負整數陣列 arr,你最開始位於該陣列的起始下標 start 處。當你位於下標 i 處時,你可以跳到 i arr i 或者 i arr i 請你判斷自己是否能夠跳到對應元素值為 0 的 任意 下標處。注意,不管是什麼情況下,你都無法跳到陣列之外。示例 1 輸入 arr 4,2,3,0,3...

1306 跳躍遊戲 III

這裡有乙個非負整數陣列arr,你最開始位於該陣列的起始下標start處。當你位於下標i處時,你可以跳到i arr i 或者i arr i 請你判斷自己是否能夠跳到對應元素值為 0 的任意下標處。注意,不管是什麼情況下,你都無法跳到陣列之外。示例 1 輸入 arr 4,2,3,0,3,1,2 star...