js + leetcode刷題:No.874 模擬行走機器人

該題標籤:貪心算法;難度:簡單;根據題意,貪的是每個方向最長能走的路。其實也是根據題意,寫出的代碼
思路:先set存儲障礙點,以防重複。然後每個指令進行一次轉向或行走判斷是否到達障礙點的判斷。關於方向,根據順時針方向定義。其中,最大歐式距離的平方 不等於 最終位置的歐式距離,而是過程中所有的歐式距離的最大值
補充:

歐式距離即直線距離,曼哈頓距離即爲到達方式的距離(多個);切比雪夫距離(Chebyshev distance)或是L∞度量是向量空間中的一種度量,二個點之間的距離定義爲其各座標數值差的最大值

題目:

  1. 模擬行走機器人
    機器人在一個無限大小的網格上行走,從點 (0, 0) 處開始出發,面向北方。該機器人可以接收以下三種類型的命令:
-2:向左轉 90 度
-1:向右轉 90 度
1 <= x <= 9:向前移動 x 個單位長度
在網格上有一些格子被視爲障礙物。

第 i 個障礙物位於網格點  (obstacles[i][0], obstacles[i][1])

如果機器人試圖走到障礙物上方,那麼它將停留在障礙物的前一個網格方塊上,但仍然可以繼續該路線的其餘部分。

返回從原點到機器人的最大歐式距離的平方。

示例 1:
輸入: commands = [4,-1,3], obstacles = []
輸出: 25
解釋: 機器人將會到達 (3, 4)
示例 2:
輸入: commands = [4,-1,4,-2,4], obstacles = [[2,4]]
輸出: 65
解釋: 機器人在左轉走到 (1, 8) 之前將被困在 (1, 4) 處

提示:

0 <= commands.length <= 10000
0 <= obstacles.length <= 10000
-30000 <= obstacle[i][0] <= 30000
-30000 <= obstacle[i][1] <= 30000
答案保證小於 2 ^ 31

解法:

// 時間 O(n+k) 空間 O(k)  n,k分別兩數組長度
/**
 * @param {number[]} commands
 * @param {number[][]} obstacles
 * @return {number}
 */
var robotSim = function(commands, obstacles) {
    let obstaclesSet = new Set()
    for(let i = 0; i < obstacles.length; i++){
        obstaclesSet.add(obstacles[i][0] + '_' + obstacles[i][1])
    }
    let dir = 0, x = 0, y = 0 // 起始位置及方向 0123 -> 北東南西
    let dx = [0, 1, 0, -1], dy = [1, 0, -1, 0]; // 各方向唯一距離,得到方向即可計算
    let res = 0
    for(let i = 0; i < commands.length; i++){
        if(commands[i] === -2){ // 向左轉90
            dir = (dir + 3) % 4
        }else if(commands[i] === -1){ // 向右轉90
            dir = (dir + 1) % 4
        }else{
            for(let j = 1; j <= commands[i]; j++){
                let nx = x + dx[dir], ny = y + dy[dir]
                if(!obstaclesSet.has(nx + '_' + ny)){
                    x = nx
                    y = ny
                    res = Math.max(res, x*x + y*y)
                }else{
                    break;
                }
            }
        }
        // console.log("x,y,dir", x, y, dir)
    }
    return res
};
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章