【每日一题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)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值