【每日力扣】74. 搜索二维矩阵 与 51. N 皇后

在这里插入图片描述

🔥 个人主页: 黑洞晓威
😀你不必等到非常厉害,才敢开始,你需要开始,才会变的非常厉害

74. 搜索二维矩阵

给你一个满足下述两条属性的 m x n 整数矩阵:

  • 每行中的整数从左到右按非严格递增顺序排列。
  • 每行的第一个整数大于前一行的最后一个整数。

给你一个整数 target ,如果 target 在矩阵中,返回 true ;否则,返回 false

image-20240519111558289

解题思路

  1. 我们可以从矩阵的右上角开始搜索,这样可以利用矩阵的性质来判断元素的位置。
  2. 如果目标值 target 小于当前元素,则可以向左移动,因为当前列元素均大于当前元素。
  3. 如果目标值 target 大于当前元素,则可以向下移动,因为当前行元素均小于当前元素。
  4. 如果相等,则直接返回 true
  5. 如果到达矩阵边界仍未找到,则返回 false

Java 代码实现

class Solution {
    public boolean searchMatrix(int[][] matrix, int target) {
        if (matrix == null || matrix.length == 0 || matrix[0].length == 0) {
            return false;
        }
        
        int m = matrix.length;
        int n = matrix[0].length;
        
        int row = 0;
        int col = n - 1;
        
        while (row < m && col >= 0) {
            if (matrix[row][col] == target) {
                return true;
            } else if (matrix[row][col] < target) {
                row++;
            } else {
                col--;
            }
        }
        
        return false;
    }
}

51. N 皇后

按照国际象棋的规则,皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子。

n 皇后问题 研究的是如何将 n 个皇后放置在 n×n 的棋盘上,并且使皇后彼此之间不能相互攻击。

给你一个整数 n ,返回所有不同的 n 皇后问题 的解决方案。

每一种解法包含一个不同的 n 皇后问题 的棋子放置方案,该方案中 'Q''.' 分别代表了皇后和空位。

image-20240519111712502

解题思路

  1. 我们可以使用回溯算法来解决 N 皇后问题。具体步骤如下:
  2. 从第一行开始放置皇后,在每一列尝试放置皇后,并检查是否与之前放置的皇后冲突。
  3. 如果没有冲突,则放置皇后并继续递归到下一行。
  4. 如果在某一行无法放置皇后(因为所有列都与之前的皇后冲突),则回溯到上一行并尝试在该行的下一列放置皇后。
  5. 当成功放置 N 个皇后时,就找到了一个解,将当前棋盘状态保存。
  6. 继续回溯直到所有组合尝试完毕。

Java 代码实现

import java.util.ArrayList;
import java.util.List;

class Solution {
    public List<List<String>> solveNQueens(int n) {
        List<List<String>> result = new ArrayList<>();
        char[][] board = new char[n][n];
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < n; j++) {
                board[i][j] = '.';
            }
        }
        solveNQueensHelper(result, board, 0);
        return result;
    }

    private void solveNQueensHelper(List<List<String>> result, char[][] board, int row) {
        if (row == board.length) {
            List<String> current = new ArrayList<>();
            for (char[] rowArray : board) {
                current.add(new String(rowArray));
            }
            result.add(current);
            return;
        }

        for (int col = 0; col < board.length; col++) {
            if (isValid(board, row, col)) {
                board[row][col] = 'Q';
                solveNQueensHelper(result, board, row + 1);
                board[row][col] = '.';
            }
        }
    }

    private boolean isValid(char[][] board, int row, int col) {
        for (int i = 0; i < row; i++) {
            if (board[i][col] == 'Q') {
                return false;
            }
            if (col - (row - i) >= 0 && board[i][col - (row - i)] == 'Q') {
                return false;
            }
            if (col + (row - i) < board.length && board[i][col + (row - i)] == 'Q') {
                return false;
            }
        }
        return true;
    }
}
  • 6
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

黑洞晓威

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值