789. 逃脫阻礙者

2021-08-22 LeetCode每日一題

鏈接:https://leetcode-cn.com/problems/escape-the-ghosts/

標籤:數組、數學

題目

你在進行一個簡化版的喫豆人遊戲。你從 [0, 0] 點開始出發,你的目的地是 target = [xtarget, ytarget] 。地圖上有一些阻礙者,以數組 ghosts 給出,第 i 個阻礙者從 ghosts[i] = [xi, yi] 出發。所有輸入均爲 整數座標 。

每一回合,你和阻礙者們可以同時向東,西,南,北四個方向移動,每次可以移動到距離原位置 1 個單位 的新位置。當然,也可以選擇 不動 。所有動作 同時 發生。

如果你可以在任何阻礙者抓住你 之前 到達目的地(阻礙者可以採取任意行動方式),則被視爲逃脫成功。如果你和阻礙者同時到達了一個位置(包括目的地)都不算是逃脫成功。

只有在你有可能成功逃脫時,輸出 true ;否則,輸出 false 。

示例 1:

輸入:ghosts = [[1,0],[0,3]], target = [0,1]
輸出:true
解釋:你可以直接一步到達目的地 (0,1) ,在 (1, 0) 或者 (0, 3) 位置的阻礙者都不可能抓住你。 

示例 2:

輸入:ghosts = [[1,0]], target = [2,0]
輸出:false
解釋:你需要走到位於 (2, 0) 的目的地,但是在 (1, 0) 的阻礙者位於你和目的地之間。 

示例 3:

輸入:ghosts = [[2,0]], target = [1,0]
輸出:false
解釋:阻礙者可以和你同時達到目的地。 

示例 4:

輸入:ghosts = [[5,0],[-10,-2],[0,-5],[-2,-2],[-7,1]], target = [7,7]
輸出:false

示例 5:

輸入:ghosts = [[-1,0],[0,1],[-1,0],[0,1],[-1,0]], target = [0,0]
輸出:true

提示:

  • 1 <= ghosts.length <= 100
  • ghosts[i].length == 2
  • -10 ^ 4 <= xi, yi <= 10 ^ 4
  • 同一位置可能有 多個阻礙者 。
  • target.length == 2
  • -10 ^ 4 <= xtarget, ytarget <= 10 ^ 4

分析

題目說只能上下左右走到達目的地,不管你怎麼螺旋走位,你到達目的地的最小距離都是| target[0] | + | target[1] |,而ghost[i]到達目的地的最小距離是| ghost[i] [0] - target[0] | + | ghost[i] [1] - target[1] |。

所以如果ghost到達目的地的最小距離 <= 你的目的地的最小距離,那麼只要ghost到目的地等着你就好了,因爲每次可以選擇不動。所以只有在你比任何一個ghost先到達目的地的情況下,纔可能贏。

編碼

class Solution {
    public boolean escapeGhosts(int[][] ghosts, int[] target) {
        // [0, 0]到目的地的距離
        int distance = Math.abs(target[0]) + Math.abs(target[1]);
        for (int[] ghost : ghosts) {
            // 阻礙者到目的地的距離不大於你到目的地的距離,則說明必然能抓住你
            if (Math.abs(ghost[0] - target[0]) + Math.abs(ghost[1] - target[1]) <= distance) {
                return false;
            }
        }

        return true;
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章