leetcode1222(可以攻击国王的皇后)–Java语言实现

leetcode1222(可以攻击国王的皇后)--Java语言实现

求:

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

「黑皇后」在棋盘上的位置分布用整数坐标数组 queens 表示,「白国王」的坐标用数组 king 表示。

「黑皇后」的行棋规定是:横、直、斜都可以走,步数不受限制,但是,不能越子行棋。

请你返回可以直接攻击到「白国王」的所有「黑皇后」的坐标(任意顺序)。

 

示例 1:

输入:queens = [[0,1],[1,0],[4,0],[0,4],[3,3],[2,4]], king = [0,0]
输出:[[0,1],[1,0],[3,3]]
解释: 
[0,1] 的皇后可以攻击到国王,因为他们在同一行上。 
[1,0] 的皇后可以攻击到国王,因为他们在同一列上。 
[3,3] 的皇后可以攻击到国王,因为他们在同一条对角线上。 
[0,4] 的皇后无法攻击到国王,因为她被位于 [0,1] 的皇后挡住了。 
[4,0] 的皇后无法攻击到国王,因为她被位于 [1,0] 的皇后挡住了。 
[2,4] 的皇后无法攻击到国王,因为她和国王不在同一行/列/对角线上。
示例 2:

输入:queens = [[0,0],[1,1],[2,2],[3,4],[3,5],[4,4],[4,5]], king = [3,3]
输出:[[2,2],[3,4],[4,4]]
示例 3:

输入:queens = [[5,6],[7,7],[2,1],[0,7],[1,6],[5,1],[3,7],[0,3],[4,0],[1,2],[6,3],[5,0],[0,4],[2,2],[1,1],[6,4],[5,4],[0,0],[2,6],[4,5],[5,2],[1,4],[7,5],[2,3],[0,5],[4,2],[1,0],[2,7],[0,1],[4,6],[6,1],[0,6],[4,3],[1,7]], king = [3,4]
输出:[[2,3],[1,4],[1,6],[3,7],[4,3],[5,4],[4,5]]
 

提示:

1 <= queens.length <= 63
queens[0].length == 2
0 <= queens[i][j] < 8
king.length == 2
0 <= king[0], king[1] < 8
一个棋盘格上最多只能放置一枚棋子。

 

题目链接: https://leetcode-cn.com/problems/queens-that-can-attack-the-king/

 

解:

1、从白国王向8个方位寻找

逆向思考问题,从白国王出发,向左上、正上、右上、正左、正右、左下、正下、右下,一共8个方位分别寻找最近的黑皇后,一旦找到了黑皇后,就将黑皇后的坐标加入返回结果集,然后换一个新的方向查找。为了避免写8个相同的for循环,使用2个dx[]和dy[]数组分别存储8个方向上移动,每一次x和y应该移动的步长,然后在一个统一的for循环中,执行8次循环,每一次循环都按dx和dy中的步长来走,这样就可以完整的遍历8个方向,最后返回结果集。

时间复杂度:O(N)(8个方向分别需要遍历1次,每次需要遍历的元素最多也不会超过N)

空间复杂度:O(N^2)(使用了一个N*N的辅助数组存储相应的位置是否有黑皇后)

public List<List<Integer>> queensAttacktheKing(int[][] queens, int[] king) {
    List<List<Integer>> retList = new LinkedList<>();
    final Integer N = 8;
    int hasQueen[][] = new int[N][N];
    for (int i = 0; i < queens.length; i++) hasQueen[queens[i][0]][queens[i][1]] = 1;
    int dx[] = {-1, -1, -1, 0, 0, 1, 1, 1};
    int dy[] = {-1, 0, 1, -1, 1, -1, 0, 1};
    for (int i = 0; i < 8; i++) {
        int x = king[0] + dx[i];
        int y = king[1] + dy[i];
        while (x >= 0 && x < N && y >= 0 && y < N) {
            if (hasQueen[x][y] == 1) {
                List<Integer> L = new LinkedList<>();
                L.add(x);
                L.add(y);
                retList.add(L);
                break;
            }
            x += dx[i];
            y += dy[i];
        }
    }
    return retList;
}
hmoban主题是根据ripro二开的主题,极致后台体验,无插件,集成会员系统
自学咖网 » leetcode1222(可以攻击国王的皇后)–Java语言实现