♟縱橫四海 模擬機器人的軌跡 Walking Robot Simulation_Leetcode #874

更新於 發佈於 閱讀時間約 1 分鐘

題目敘述 Walking Robot Simulation


機器人在一個無限大小的 X-Y 2D平面上行走,從點 (0, 0) 開始出發,一開始面向北方。

機器人可以接收以下三種類型的命令

-2 :向左轉 90 度

-1 :向右轉 90 度

1 <= x <= 9 :向前移動 x 個單位長度


在網格上有一些格子被視為障礙物 obstacles 。

第 i 個障礙物位於網格點 obstacles[i] = (xi, yi) 。 機器人無法走到障礙物上,它將會停留在障礙物的前一個網格方塊上,並繼續執行下一個命令。


請計算並且返回機器人距離原點的 最大距離 的 平方 。 (也就是說,如果距離為 5 ,則回傳 25 )


測試範例

Example 1:

Input: commands = [4,-1,3], obstacles = []
Output: 25
Explanation:

機器人開始位於 (0, 0)
1. 向北移動 4 個單位,到達 (0, 4)
2. 右轉
3. 向東移動 3 個單位,到達 (3, 4)
距離原點最遠的是 (3, 4) ,距離為 3^2 + 4^2 = 25

Example 2:

Input: commands = [4,-1,4,-2,4], obstacles = [[2,4]]
Output: 65
Explanation:

機器人開始位於 (0, 0)
1. 向北移動 4 個單位,到達 (0, 4)
2. 右轉
3. 向東移動 1 個單位,然後被位於 (2, 4) 的障礙物阻擋,機器人停在 (1, 4)
4. 左轉
5. 往北走 4 個單位,到達 (1, 8)
距離原點最遠的是 (1, 8) ,距離為 1^2 + 8^2 = 65

Example 3:

Input: commands = [6,-1,-1,6], obstacles = []
Output: 36
Explanation:

機器人開始位於 (0, 0):
1. 向北移動 6 個單位,到達 (0, 6).
2. 右轉
3. 右轉
4. 向南移動 6 個單位,到達 (0, 0).
機器人距離原點最遠的點是 (0, 6),其距離的平方是 6^2 = 36 個單位。

約束條件

Constraints:

  • 1 <= commands.length <= 10^4

指令的長度介於1~一萬。

  • commands[i] is either -2-1, or an integer in the range [1, 9].

指令內容是-2(左轉), -1(右轉) 或者1~9之間的整數。

  • 0 <= obstacles.length <= 10^4

障礙物陣列的長度介於0~一萬之間。

  • -3 * 10^4 <= xi, yi <= 3 * 10^4

x, y 座標都介於 負三萬~正三萬。

  • The answer is guaranteed to be less than 2^31.

答案一定在4Byte整數範圍內。


演算法 根據指令模擬行進過程


指令內容是-2(左轉), -1(右轉) 或者1~9之間的整數(直接往前走k步)。

根據指令格式,判斷左轉、右轉、還是直接往前走k步


每回合移動完之後,計算和原點的距離。

最後,回傳和原點的距離最大值的平方


程式碼 根據指令模擬行進過程

class Solution:
def robotSim(self, commands, obstacles):
x, y = 0, 0
max_dist_square, direction = 0, 0

# North West South East
move, obstacles = [(0, 1), (-1, 0), (0, -1), (1, 0), ], set(map(tuple, obstacles))

for command in commands:

# Turn left
if command == -2: direction = (direction + 1) % 4

# Turn right
elif command == -1: direction = (direction - 1) % 4

else:

# Keep moving k times
delta_x, delta_y = move[direction]
while command and (x + delta_x, y + delta_y) not in obstacles:
x += delta_x
y += delta_y
command -= 1

max_dist_square = max(max_dist_square, x ** 2 + y ** 2)

return max_dist_square

複雜度分析

時間複雜度: O(n)

掃描每個指令一次,根據指令做出對應的行動。

空間複雜度: O(obstacle)

需要建立一個障礙物集合,所需空間為O(obstacle)


Reference

[1] Walking Robot Simulation - LeetCode

留言
avatar-img
留言分享你的想法!
avatar-img
小松鼠的演算法樂園
96會員
427內容數
由有業界實戰經驗的演算法工程師, 手把手教你建立解題的框架, 一步步寫出高效、清晰易懂的解題答案。 著重在讓讀者啟發思考、理解演算法,熟悉常見的演算法模板。 深入淺出地介紹題目背後所使用的演算法意義,融會貫通演算法與資料結構的應用。 在幾個經典的題目融入一道題目的多種解法,或者同一招解不同的題目,擴展廣度,並加深印象。
2024/10/06
題目敘述 Rank Transform of an Array 給定一個陣列arr,請根據數字的大小給予序號,序號值介於1~len( set(arr) )之間。 最大的數字給予最大的序號。 次大的數字給予次大的序號。 ...依此類推 最小的數字給予最小的序號1。
Thumbnail
2024/10/06
題目敘述 Rank Transform of an Array 給定一個陣列arr,請根據數字的大小給予序號,序號值介於1~len( set(arr) )之間。 最大的數字給予最大的序號。 次大的數字給予次大的序號。 ...依此類推 最小的數字給予最小的序號1。
Thumbnail
2024/10/01
題目敘述 Check If Array Pairs Are Divisible by k 給定一個長度為偶數的整數陣列arr,和一個整數k 。 我們想把陣列元素兩兩一組組成pair,使得每個pair的總和可以被k整除。 如果做得到,返回True。 如果不行,返回False。
Thumbnail
2024/10/01
題目敘述 Check If Array Pairs Are Divisible by k 給定一個長度為偶數的整數陣列arr,和一個整數k 。 我們想把陣列元素兩兩一組組成pair,使得每個pair的總和可以被k整除。 如果做得到,返回True。 如果不行,返回False。
Thumbnail
2024/09/29
My Calendar II 給定一個行事曆的class定義和行程安排的介面。 請完成下列function 1.建構子MyCalendarTwo() 2.boolean book(int start, int end) 在行事曆加入一項新行程,起始時間為start, 結束時間為end。
Thumbnail
2024/09/29
My Calendar II 給定一個行事曆的class定義和行程安排的介面。 請完成下列function 1.建構子MyCalendarTwo() 2.boolean book(int start, int end) 在行事曆加入一項新行程,起始時間為start, 結束時間為end。
Thumbnail
看更多
你可能也想看
Thumbnail
2025 vocus 推出最受矚目的活動之一——《開箱你的美好生活》,我們跟著創作者一起「開箱」各種故事、景點、餐廳、超值好物⋯⋯甚至那些讓人會心一笑的生活小廢物;這次活動不僅送出了許多獎勵,也反映了「內容有價」——創作不只是分享、紀錄,也能用各種不同形式變現、帶來實際收入。
Thumbnail
2025 vocus 推出最受矚目的活動之一——《開箱你的美好生活》,我們跟著創作者一起「開箱」各種故事、景點、餐廳、超值好物⋯⋯甚至那些讓人會心一笑的生活小廢物;這次活動不僅送出了許多獎勵,也反映了「內容有價」——創作不只是分享、紀錄,也能用各種不同形式變現、帶來實際收入。
Thumbnail
嗨!歡迎來到 vocus vocus 方格子是台灣最大的內容創作與知識變現平台,並且計畫持續拓展東南亞等等國際市場。我們致力於打造讓創作者能夠自由發表、累積影響力並獲得實質收益的創作生態圈!「創作至上」是我們的核心價值,我們致力於透過平台功能與服務,賦予創作者更多的可能。 vocus 平台匯聚了
Thumbnail
嗨!歡迎來到 vocus vocus 方格子是台灣最大的內容創作與知識變現平台,並且計畫持續拓展東南亞等等國際市場。我們致力於打造讓創作者能夠自由發表、累積影響力並獲得實質收益的創作生態圈!「創作至上」是我們的核心價值,我們致力於透過平台功能與服務,賦予創作者更多的可能。 vocus 平台匯聚了
Thumbnail
題目敘述: 給定一個二維陣列的高與寬,並且給定起點位置座標。 請從起點位置開始順時針拜訪陣列元素,並且把沿路走過的座標記錄下來。 以陣列的形式返回答案。
Thumbnail
題目敘述: 給定一個二維陣列的高與寬,並且給定起點位置座標。 請從起點位置開始順時針拜訪陣列元素,並且把沿路走過的座標記錄下來。 以陣列的形式返回答案。
Thumbnail
題目敘述 題目會給我們一個輸入陣列nums,每個元素值代表那個格子點可以左右位移的固定長度。 例如,假設 nums[i] = 3,那麼下一步可以移動到nums[i-3] 或 nums[i+3]這兩個格子點。 題目​會給定一個起始點start索引位置,請問我們能不能走到內部數值為0的格子點?
Thumbnail
題目敘述 題目會給我們一個輸入陣列nums,每個元素值代表那個格子點可以左右位移的固定長度。 例如,假設 nums[i] = 3,那麼下一步可以移動到nums[i-3] 或 nums[i+3]這兩個格子點。 題目​會給定一個起始點start索引位置,請問我們能不能走到內部數值為0的格子點?
Thumbnail
題目敘述 題目會給我們一個輸入陣列nums,每個元素值代表那個格子點可以跳躍的最大長度。 題目保證始從最左邊的格子點出發開始跳,一定可以成功抵達終點,請問最少跳躍次數是說少? 題目的原文敘述 測試範例 Example 1: Input: nums = [2,3,1,1,4] Outp
Thumbnail
題目敘述 題目會給我們一個輸入陣列nums,每個元素值代表那個格子點可以跳躍的最大長度。 題目保證始從最左邊的格子點出發開始跳,一定可以成功抵達終點,請問最少跳躍次數是說少? 題目的原文敘述 測試範例 Example 1: Input: nums = [2,3,1,1,4] Outp
Thumbnail
題目敘述 題目會給我們一個輸入陣列nums,每個元素值代表那個格子點可以跳躍的最大長度。 一開始從最左邊的格子點出發開始跳,請問可以成功抵達終點,也就是最右邊的格子點嗎? 如果可以,返回 True。 如果不行,返回False。 題目的原文敘述 測試範例 Example 1: In
Thumbnail
題目敘述 題目會給我們一個輸入陣列nums,每個元素值代表那個格子點可以跳躍的最大長度。 一開始從最左邊的格子點出發開始跳,請問可以成功抵達終點,也就是最右邊的格子點嗎? 如果可以,返回 True。 如果不行,返回False。 題目的原文敘述 測試範例 Example 1: In
Thumbnail
題目敘述 題目會給定一個指定高度和寬的方格版,還有一顆小球的起始位置,和最大移動步數。 小球每一步可以選擇向上、下、左、右移動一格,請問小球能走到方格版界外的路徑方法數總共有幾種? 方法數可能很大,題目要求,最後回傳答案時,先對10^9+7做除法取餘數再回傳。 題目的原文敘述 約束條件
Thumbnail
題目敘述 題目會給定一個指定高度和寬的方格版,還有一顆小球的起始位置,和最大移動步數。 小球每一步可以選擇向上、下、左、右移動一格,請問小球能走到方格版界外的路徑方法數總共有幾種? 方法數可能很大,題目要求,最後回傳答案時,先對10^9+7做除法取餘數再回傳。 題目的原文敘述 約束條件
Thumbnail
題目敘述 題目會給我們一個不規則排列的二維陣列,要求我們列出從起點出發,走次對角線,由左下到右上逐層拜訪的路徑。
Thumbnail
題目敘述 題目會給我們一個不規則排列的二維陣列,要求我們列出從起點出發,走次對角線,由左下到右上逐層拜訪的路徑。
Thumbnail
場景是防禦城市,免於怪獸的入侵 題目會給定兩個陣列 一個是dist,代表怪獸和城市之間的距離 一個是speed,代表怪獸每分鐘前進的距離,也就是怪獸的速度 有一把一開始已經充滿電的電動槍,一槍可以擊殺一隻怪獸,擊發後需要耗費一分鐘的冷卻時間讓電動槍再次充滿電。 題目要求我們計算最多可以消滅幾隻怪獸?
Thumbnail
場景是防禦城市,免於怪獸的入侵 題目會給定兩個陣列 一個是dist,代表怪獸和城市之間的距離 一個是speed,代表怪獸每分鐘前進的距離,也就是怪獸的速度 有一把一開始已經充滿電的電動槍,一槍可以擊殺一隻怪獸,擊發後需要耗費一分鐘的冷卻時間讓電動槍再次充滿電。 題目要求我們計算最多可以消滅幾隻怪獸?
Thumbnail
題目會給定我們一個陣列,要求我們重新安排順序,把等於零的數字搬到後面。 同時必須保持原本數字的前後相對次序。
Thumbnail
題目會給定我們一個陣列,要求我們重新安排順序,把等於零的數字搬到後面。 同時必須保持原本數字的前後相對次序。
Thumbnail
上次學過2D DP入門題目 Unique Path,接著來看進階一點的高度關聯延伸題 Unique Path II,這次板子上多了障礙物。 題目給定我們一個棋盤的高與寬,起點固定在左上角,終點固定在右下角。 每一步只能選擇往右走一格,或者往下走一格,不能回頭。 有障礙物的格子無法通過。
Thumbnail
上次學過2D DP入門題目 Unique Path,接著來看進階一點的高度關聯延伸題 Unique Path II,這次板子上多了障礙物。 題目給定我們一個棋盤的高與寬,起點固定在左上角,終點固定在右下角。 每一步只能選擇往右走一格,或者往下走一格,不能回頭。 有障礙物的格子無法通過。
Thumbnail
進階圖論題目: 計算最短的一筆畫路徑長 題目會給定我們一張圖和對應的相鄰矩陣,要求我們返回一筆畫拜訪所有節點的最短路徑長,起終點不拘。
Thumbnail
進階圖論題目: 計算最短的一筆畫路徑長 題目會給定我們一張圖和對應的相鄰矩陣,要求我們返回一筆畫拜訪所有節點的最短路徑長,起終點不拘。
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News