用 C++ 編寫跳躍遊戲 III


假設我們有一個非負整數陣列 arr,我們最初位於陣列的 start 索引處。當我們出現在索引 i 處時,我們可以跳到 i + arr[i] 或 i - arr[i],檢查我們是否可以到達值為 0 的任何索引。我們必須記住,我們不得在任何時候跳出陣列。因此,如果輸入如下:arr = [4,2,3,0,3,1,2],並且從 5 開始,則輸出將為 true,因為移動 5 → 4 → 1 → 3,或 5 → 6 → 4 → 1 → 3。

為了解決這個問題,我們將遵循以下步驟 −

  • n := arr 的大小
  • 定義一個佇列 q,將 start 插入 q 中,定義一個名為 visited 的集合,並將 start 插入集合 visited 中
  • 當佇列不為空時,
    • curr := q 的首個元素,從 q 中刪除首個元素
    • 如果 array[curr] 為 0,則返回 true
    • 如果 curr + arr[curr] < n 且 curr + arr[curr] 不存在於 visited 集合中,則
      • 將 curr + arr[curr] 插入 q 中
      • 將 curr + arr[curr] 插入 visited 中
    • 如果 curr - arr[curr] >= 0 且 curr - arr[curr] 不存在於 visited 集合中,則
      • 將 curr - arr[curr] 插入到 q 中
      • 將 curr - arr[curr] 插入到 visited 中
  • 返回 false

示例

讓我們看看下面的實現,以便更好地理解 −

 實際示例

#include <bits/stdc++.h>
using namespace std;
class Solution {
public:
   bool canReach(vector<int>& arr, int start) {
      int n = arr.size();
      queue <int> q;
      q.push(start);
      set <int> visited;
      visited.insert(start);
      while(!q.empty()){
         int curr = q.front();
         q.pop();
         if(arr[curr] == 0)return true;
         if(curr + arr[curr] < n && !visited.count(curr + arr[curr])){
            q.push(curr + arr[curr]);
            visited.insert(curr + arr[curr]);
         }
         if(curr - arr[curr] >= 0 && !visited.count(curr - arr[curr])){
            q.push(curr - arr[curr]);
            visited.insert(curr - arr[curr]);
         }
      }
      return false;
   }
};
main(){
   vector<int> v = {4,2,3,0,3,1,2};
   Solution ob;
   cout << (ob.canReach(v, 5));
}

輸入

[4,2,3,0,3,1,2]
5

輸出

1

更新於: 30-04-2020

338 瀏覽

開啟您的職業生涯

完成該課程獲得認證

開始
廣告