【算法】【感悟】LCP 03. 机器人大冒险

当面试官问我场景题、算法时,他们不希望看到我直接上手就写。
他们想慢慢的让我自己思考、与面试官交谈。
说出对这道题的理解。
LCP 03. 机器人大冒险
如下:
这道题,它的目的是求出机器人是否能够安全到达终点。
其中只需要判断:1、机器人能到达终点;2、机器人不会撞墙

思路最简单的方法是:模拟机器人,一步一步的走。当撞墙或者远离终点时,就返回false。到达终点则返回true。(没超时,985ms)

另一种思路:用数学的方法,优化时间复杂度,只需要判断1、能否到达终点;2、是否撞墙;即可。(0ms)

class Solution {
    // 1、不撞墙;2、能到达终点
    int n;
    public boolean robot(String command, int[][] obstacles, int x, int y) {
        this.n = command.length();
        int sx = 0, sy = 0;
        for (int i = 0; i < n; i++) {
            if (command.charAt(i) == 'U')
                sy++;
            else
                sx++;
        }
        // 是否能到达终点
        if (!canReach(command, x, y, sx, sy))
            return false;
        // 是否撞墙,如果墙在终点之外,则无需判断
        for (int[] obstacle : obstacles) {
            if (obstacle[0] > x || obstacle[1] > y)
                continue;
            if (canReach(command, obstacle[0], obstacle[1], sx, sy)) {
                return false;
            }
        }
        return true;
    }

    
    public boolean canReach(String cmd, int tx, int ty, int x, int y) {
        int round = Math.min(tx/x, ty/y);
        int nx = round * x, ny = round * y;
        if (nx == tx && ny == ty)
            return true;
        for (int i = 0; i < n; i++) {
            if (cmd.charAt(i) == 'U')
                ny++;
            else 
                nx++;
            if (nx > tx || ny > ty)
                return false;
            if (nx == tx && ny == ty)
                return true;
        }
        return true;
    }
}

我每次拿到一个算法,就直接去想解法,dfs、bfs、动态规划、贪心、并查集。而忽略了题目本身。这样做出来的答案,不会是最优解。

我拿到一道题时,需要把这道题的解答流程写出来,比如这道题就是:1、判断可以到达终点;2、判断是否会撞墙。
比如状态题:股票买卖1~5,需要判断多种情况,流程树。

所以我以后拿到题目,最开始不要想着用什么数据结构、算法来解决。而是专注于题目本身,需要我干什么。

上一篇:【Codeforces 817D】Imbalanced Array


下一篇:(转)提供者模式和策略模式