【每日一题Day326】LC1222可以攻击国王的皇后 | 哈希表+模拟

可以攻击国王的皇后【LC1222】

在一个 8x8 的棋盘上,放置着若干「黑皇后」和一个「白国王」。

给定一个由整数坐标组成的数组 queens ,表示黑皇后的位置;以及一对坐标 king ,表示白国王的位置,返回所有可以攻击国王的皇后的坐标(任意顺序)。

  • 思路

    • 将Queen的坐标一维化,记录在哈希表中
    • 从King出发,寻找8个方向中第一个Queen的位置
  • 实现

    class Solution {
        public List<List<Integer>> queensAttacktheKing(int[][] queens, int[] king) {
            List<List<Integer>> res = new ArrayList<>();
            int[][] dirs = {{1, 0}, {-1, 0}, {0, -1}, {0, 1}, {1, 1}, {1, -1}, {-1, 1}, {-1, -1}};
            int N = 8;
            Set<Integer> set = new HashSet<>();
            for (int[] q : queens){
                set.add(q[0] * N + q[1]);
            }
            for (int i = 0; i < 8; i++){
                int x = king[0] + dirs[i][0], y = king[1] + dirs[i][1];
                while (x >= 0 && x < N && y >= 0 && y < N){
                    if (set.contains(x * N + y)){
                        res.add(Arrays.asList(x, y));
                        break;
                    }
                    x += dirs[i][0];
                    y += dirs[i][1];
                }
    
            }
            return res;
        }
    }
    
    • 复杂度分析
      • 时间复杂度: O ( m + n ) O(m+n) O(m+n)
      • 空间复杂度: O ( m ) O(m) O(m)

你可能感兴趣的:(每日一题,哈希表,散列表,数据结构)