【Leetcode】874. Walking Robot Simulation

題目地址:

https://leetcode.com/problems/walking-robot-simulation/

給定一個二維網格,有個機器人從(0,0)(0,0)出發,再給定一系列命令,以整數表示1-1表示向右轉,2-2表示向左轉,其餘的命令都是[1,9][1,9]表示向前走若干步。再給定一系列障礙物的座標,機器人走的路上如果有障礙物,則會停在障礙物之前。一開始機器人是向上走的。問命令執行完之前機器人距離原點的歐幾里得距離的平方的最大值。

先用一個類表示座標,然後開一個哈希表存儲所有的障礙物座標。接着直接模擬機器人走的路徑,用一個變量表示當前的方向即可。每走一步先看一下是否到了障礙物,如果到了則退出,否則走一步。每次機器人停留的時候更新一下得到的最大歐幾里得距離平方。代碼如下:

import java.util.HashSet;
import java.util.Objects;
import java.util.Set;

public class Solution {
    
    class Pair {
        int x, y;
        Pair(int x, int y) {
            this.x = x;
            this.y = y;
        }
        
        // 返回當前位置與原點歐幾里得距離的平方
        public int square() {
            return x * x + y * y;
        }
    
        @Override
        public boolean equals(Object o) {
            Pair pair = (Pair) o;
            return x == pair.x && y == pair.y;
        }
    
        @Override
        public int hashCode() {
            return Objects.hash(x, y);
        }
    }
    
    public int robotSim(int[] commands, int[][] obstacles) {
        int res = 0;
        
        // 如果當前方向用i來表示,那麼方向單位向量爲(dir[i], dir[i + 1]);
        // 如果要向右轉,則將i加1後模4,如果向左轉則將i加3後模4
        int[] dir = {0, 1, 0, -1};
        int curDir = 0;
    
    	// 存所有障礙物的座標
        Set<Pair> obs = new HashSet<>();
        for (int i = 0; i < obstacles.length; i++) {
            obs.add(new Pair(obstacles[i][0], obstacles[i][1]));
        }
    
    	// 表示當前位置座標
        Pair cur = new Pair(0, 0);
        for (int i = 0; i < commands.length; i++) {
            if (commands[i] == -1) {
                curDir = (curDir + 1) % 4;
            } else if (commands[i] == -2) {
                curDir = (curDir + 3) % 4;
            } else {
            	// 取出方向單位向量
                int dx = dir[curDir], dy = dir[(curDir + 1) % 4];
                // 向該方向走若干步
                for (int j = 0; j < commands[i]; j++) {
                	// 遇到障礙了,直接退出循環
                    if (obs.contains(new Pair(cur.x + dx, cur.y + dy))) {
                        break;
                    }
                    cur.x += dx;
                    cur.y += dy;
                }
            }
            
            // 更新答案
            res = Math.max(res, cur.square());
        }
        
        return res;
    }
}

時間複雜度O(n)O(n)nn爲命令個數;空間O(m)O(m)mm爲障礙物個數。

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