1197. Minimum Knight Moves

ไฝ ้œ€่ฆๆ„่ฏ†ๅˆฐๆ— ่ฎบ[x, y]ๅœจๅ“ชไธช่ฑก้™๏ผŒๅช่ฆไป–ไธŽ๏ผˆ0๏ผŒ0๏ผ‰็š„่ท็ฆป็›ธ็ญ‰๏ผŒๅฎž้™…ๅœจๅ“ชไธช่ฑก้™้ƒฝๆ˜ฏ็ญ‰ไปท็š„

so ๅ– abs for x, y (target)

ๆœ‰ไธ€ไธช็ป†่Š‚้œ€่ฆๆณจๆ„็š„ๆ˜ฏ่™ฝ็„ถๆˆ‘ไปฌๅฏน[x, y]ๅ–ไบ†็ปๅฏนๅ€ผ๏ผŒไฝ†ๆ˜ฏๅนถไธๆ„ๅ‘ณ็€่ทฏๅพ„ไธญไธไผš็ป่ฟ‡

"ๅๆ ‡ๅ€ผไธบ่ดŸ "็š„็‚นใ€‚ไพ‹ๅญๅฐฑๆ˜ฏ

(0, 0) -> (2, -1) -> (1, 1)

2,-1 1,2

so ้œ€่ฆๅˆคๆ–ท >= -1 ้€™ๅ€‹ๆขไปถ, or >= -2

private boolean isValid(int x, int y, Set<String> visited) {
    return x >= -2 && y >= -2 && !visited.contains(x + "," + y);
}

T: O(mn), mn is the total cell we traversed

S: O(mn)

class Solution {
    private static final int[][] DIRS = {{1,2},{1,-2},{-1,2},{-1,-2},{2,1},{2,-1},{-2,1},{-2,-1}};
    public int minKnightMoves(int x, int y) {
        x = Math.abs(x);
        y = Math.abs(y);
        
        Set<String> visited = new HashSet<>();
        Queue<int[]> queue = new LinkedList<>();
        queue.offer(new int[]{0, 0});
        visited.add(0 + "," + 0);
        
        int steps = 0;
        while (!queue.isEmpty()) {
            int size = queue.size();
            for (int q = 0; q < size; q++) {
                int[] cur = queue.poll();
                int curX = cur[0];
                int curY = cur[1];
                
                if (curX == x && curY == y) {
                    return steps;
                }
                
                for (int[] dir : DIRS) {
                    int nextX = curX + dir[0];
                    int nextY = curY + dir[1];
                    
                    if (!isValid(nextX, nextY, visited)) {
                        continue;
                    }
                    queue.offer(new int[]{nextX, nextY});
                    visited.add(nextX + "," + nextY);
                }
            }
            steps++;
        }
        return -1;
    }
    private boolean isValid(int x, int y, Set<String> visited) {
        return x >= -2 && y >= -2 && !visited.contains(x + "," + y);
    }
}ja

Last updated