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;
}
}