LeetCode - 점프 게임 III
                                            
                                                
                                                
                                                
                                                
                                                
                                                 17278 단어  gojavascriptalgorithmsprogramming
                    
문제 설명
음수가 아닌 정수 배열 arr이 주어지면 초기에 배열의 시작 인덱스에 위치합니다. 인덱스 i에 있을 때 i + arr[i] 또는 i - arr[i]로 점프하여 값이 0인 인덱스에 도달할 수 있는지 확인합니다.
언제든지 어레이 외부로 이동할 수 없습니다.
문제 진술 출처: https://leetcode.com/problems/jump-game-iii/
예 1:
Input: arr = [4, 2, 3, 0, 3, 1, 2], start = 5
Output: true
Explanation:
All possible ways to reach at index 3 with value 0 are:
index 5 -> index 4 -> index 1 -> index 3
index 5 -> index 6 -> index 4 -> index 1 -> index 3
예 2:
Input: arr = [4, 2, 3, 0, 3, 1, 2], start = 0
Output: true
Explanation:
One possible way to reach at index 3 with value 0 is:
index 0 -> index 4 -> index 1 -> index 3
예 3:
Input: arr = [3, 0, 2, 1, 2], start = 2
Output: false
Explanation: There is no way to reach at index 1 with value 0.
제약:
- 1 <= arr.length <= 5 * 10^4
- 0 <= arr[i] < arr.length
- 0 <= start < arr.length
설명
문제는 Jump Game 및 Jump Game II 의 확장 버전입니다. BFS 또는 DFS 접근 방식을 사용하여 이 문제를 해결할 수 있습니다.
이번 포스트에서는 BFS 방식에 대해 알아보겠습니다.
BFS 방식
우리는 시작 위치를 대기열로 밀어 넣고 이웃 탐색을 시작합니다. 방문한 노드를 표시하기 위해 부울 배열을 유지 관리해야 합니다.
먼저 알고리즘을 확인합시다.
// canReach(arr, start)
- set n = arr.size()
      queue q = [start]
      int visited[n]
      int node
- loop while !q.empty()
    node = q.start()
    q.pop()
    if arr[node] == 0
      return true
    if visited[node]
      continue
    if node - arr[node] >= 0
      q.push(node - arr[node])
    if node + arr[node] < 4
      q.push(node + arr[node])
    visited[node] = true
- while end
- return false
위 접근법의 시간복잡도는 O(N)이고 공간복잡도는
에).
C++, Golang 및 Javascript에서 솔루션을 확인합시다.
C++ 솔루션
class Solution {
public:
    bool canReach(vector<int>& arr, int start) {
        int n = arr.size();
        queue<int> q{{start}};
        int node;
        vector<bool> visited(n);
        while(!q.empty()) {
            node = q.front();
            q.pop();
            if(arr[node] == 0) {
                return true;
            }
            if(visited[node]) {
                continue;
            }
            if(node - arr[node] >= 0) {
                q.push(node - arr[node]);
            }
            if(node + arr[node] < n) {
                q.push(node + arr[node]);
            }
            visited[node] = true;
        }
        return false;
    }
};
골랑 솔루션
func canReach(arr []int, start int) bool {
    n := len(arr)
    queue := []int{start}
    visited := make([]bool, n)
    for len(queue) != 0 {
        node := queue[0]
        queue = queue[1:]
        if arr[node] == 0 {
            return true
        }
        if visited[node] {
            continue
        }
        if node - arr[node] >= 0 {
            queue = append(queue, node - arr[node])
        }
        if node + arr[node] < n {
            queue = append(queue, node + arr[node])
        }
        visited[node] = true
    }
    return false
}
자바스크립트 솔루션
var canReach = function(arr, start) {
    let n = arr.length;
    let queue = [start];
    let visited = [];
    let node;
    while(queue.length > 0) {
        node = queue[0];
        queue.shift();
        if(arr[node] == 0) {
            return true;
        }
        if(visited[node]) {
            continue;
        }
        if(node - arr[node] >= 0) {
            queue.push(node - arr[node]);
        }
        if(node + arr[node] < n) {
            queue.push(node + arr[node]);
        }
        visited[node] = true;
    }
    return false;
};
주어진 입력에 대해 알고리즘을 연습해 봅시다.
Input: arr = [4, 2, 3, 0, 3, 1, 2]
       start = 5
Step 1: n = arr.size()
          = 7
        queue<int> q{{start}}
        q = [5]
        int node
        vector<bool> visited(n)
Step 2: loop while !q.empty()
        q = [5]
        true
        node = q.front()
             = 5
        q.pop()
        q = []
        if arr[node] == 0
           arr[5] == 0
           1 == 0
           false
        if visited[node]
           visited[5]
           false
        if node - arr[node] >= 0
           5 - arr[5] >= 0
           5 - 1 >= 0
           4 >= 0
           true
           q.push(node - arr[node])
           q.push(4)
           q = [4]
        if node + arr[node] < n
           5 + arr[5] < 7
           5 + 1 < 7
           6 < 7
           true
           q.push(node + arr[node])
           q.push(6)
           q = [4, 6]
        visited[node] = true
        visited[5] = true
Step 3: loop while !q.empty()
        q = [4, 6]
        true
        node = q.front()
             = 4
        q.pop()
        q = [6]
        if arr[node] == 0
           arr[4] == 0
           3 == 0
           false
        if visited[node]
           visited[4]
           false
        if node - arr[node] >= 0
           4 - arr[4] >= 0
           4 - 3 >= 0
           1 >= 0
           true
           q.push(node - arr[node])
           q.push(1)
           q = [6, 1]
        if node + arr[node] < n
           4 + arr[4] < 7
           4 + 3 < 7
           7 < 7
           false
        visited[node] = true
        visited[4] = true
Step 4: loop while !q.empty()
        q = [6, 1]
        true
        node = q.front()
             = 6
        q.pop()
        q = [1]
        if arr[node] == 0
           arr[6] == 0
           2 == 0
           false
        if visited[node]
           visited[6]
           false
        if node - arr[node] >= 0
           6 - arr[6] >= 0
           6 - 2 >= 0
           4 >= 0
           true
           q.push(node - arr[node])
           q.push(4)
           q = [1, 4]
        if node + arr[node] < n
           6 + arr[6] < 7
           6 + 2 < 7
           8 < 7
           false
        visited[node] = true
        visited[6] = true
Step 5: loop while !q.empty()
        q = [1, 4]
        true
        node = q.front()
             = 1
        q.pop()
        q = [4]
        if arr[node] == 0
           arr[1] == 0
           2 == 0
           false
        if visited[node]
           visited[1]
           false
        if node - arr[node] >= 0
           1 - arr[1] >= 0
           1 - 2 >= 0
           -1 >= 0
           false
        if node + arr[node] < n
           1 + arr[1] < 7
           1 + 2 < 7
           3 < 7
           true
           q.push(node + arr[node])
           q.push(3)
           q = [4, 3]
        visited[node] = true
        visited[1] = true
Step 6: loop while !q.empty()
        q = [4, 3]
        true
        node = q.front()
             = 4
        q.pop()
        q = [3]
        if arr[node] == 0
           arr[4] == 0
           0 == 0
           true
           return true
We return the answer as true.
Reference
이 문제에 관하여(LeetCode - 점프 게임 III), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/_alkesh26/leetcode-jump-game-iii-4gbj텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
                                
                                
                                
                                
                                
                                우수한 개발자 콘텐츠 발견에 전념
                                (Collection and Share based on the CC Protocol.)