当前位置: 首页 > news >正文

LeetCode之矩阵

36. 有效的数独

class Solution {// 方法 isValidSudoku 接收一个字符二维数组 board,表示数独棋盘,返回是否有效public boolean isValidSudoku(char[][] board) {// 创建三个二维数组来记录每一行、列和子框中数字的出现次数int[][] rows = new int[9][9];      // 行记录int[][] columns = new int[9][9];   // 列记录int[][][] subboxes = new int[3][3][9]; // 子框记录// 遍历整个棋盘for (int i = 0; i < 9; i++) {for (int j = 0; j < 9; j++) {char c = board[i][j]; // 当前单元格的字符// 如果单元格不是空格(即不是 '.')if (c != '.') {// 计算当前数字的索引(1-9 映射到 0-8) 如果重复相同的数映射到同一个位置会不断+1,如果重复就会大于1int index = c - '0' - 1; // 在行、列和子框中更新当前数字的出现次数rows[i][index]++;        // 增加行的计数columns[j][index]++;     // 增加列的计数subboxes[i / 3][j / 3][index]++; // 增加子框的计数// 如果某个位置的计数超过 1,说明出现重复,返回 falseif (rows[i][index] > 1 || columns[j][index] > 1 || subboxes[i / 3][j / 3][index] > 1) {return false; // 数独无效}}}}// 如果循环结束,说明没有发现重复,返回 truereturn true; // 数独有效}
}

54. 螺旋矩阵

class Solution {// // 方法 spiralOrder 接收一个二维整数数组 matrix,返回矩阵的螺旋顺序遍历结果public List<Integer> spiralOrder(int[][] matrix) {// 获取矩阵的行数int m = matrix.length;// 获取矩阵的列数int n = matrix[0].length;// 定义四个边界// 上边界int up = 0;// 左边界int left = 0;// 右边界int right = n - 1;// 下边界int down = m - 1;// 存储结果的列表List<Integer> result =  new ArrayList<>();// 使用循环遍历,直到所有元素都被访问while(true) {// 从左到右遍历上边界for (int i = left; i <= right; i++) {// 添加当前元素到结果列表中result.add(matrix[up][i]);}// 更新上边界,检查是否已超出下边界if (++up > down) {// 如果上边界超过下边界,结束循环break;}// 从上到下遍历右边界for (int i = up; i <= down; i++) {result.add(matrix[i][right]); // 添加当前元素到结果列表中}// 更新右边界,检查是否已超出左边界if (--right < left) {break; // 如果右边界超过左边界,结束循环}// 从右到左遍历下边界for (int i = right; i >= left; i--) {result.add(matrix[down][i]); // 添加当前元素到结果列表中}// 更新下边界,检查是否已超出上边界if (--down < up) {break; // 如果下边界超过上边界,结束循环}// 从下到上遍历左边界for (int i = down; i >= up; i--) {result.add(matrix[i][left]); // 添加当前元素到结果列表中}// 更新左边界,检查是否已超出右边界if (++left > right) {break; // 如果左边界超过右边界,结束循环}}// 返回螺旋顺序遍历的结果return result;}}

48. 旋转图像

class Solution {// 方法 rotate 接收一个二维整数数组 matrix,表示要旋转的矩阵public void rotate(int[][] matrix) {// 获取矩阵的行数 mint m = matrix.length;// 获取矩阵的列数 nint n = matrix[0].length;// 创建一个临时矩阵,用于存储原矩阵的值int[][] temp = new int[m][];for (int i = 0; i < m; i++) {// 深拷贝原矩阵的每一行,以防旋转时修改原矩阵的值temp[i] = matrix[i].clone(); // 使用 clone() 方法进行深拷贝}// 遍历临时矩阵,将值重新赋值到原矩阵中的适当位置,完成顺时针旋转for (int i = 0; i < m; i++) {for (int j = 0; j < n; j++) {// 根据旋转公式,把 temp[i][j] 放到 matrix[j][n - 1 - i]matrix[j][n - 1 - i] = temp[i][j];}}}}

73. 矩阵置零

class Solution {// 方法 setZeroes 接收一个二维整数数组 matrix,表示要处理的矩阵public void setZeroes(int[][] matrix) {int m = matrix.length; // 获取矩阵的行数int n = matrix[0].length; // 获取矩阵的列数// 创建两个标记数组,用于记录需要置零的行和列boolean[] row = new boolean[m]; // 行标记位boolean[] col = new boolean[n]; // 列标记位// 第一次遍历整个矩阵,查找值为 0 的元素for (int i = 0; i < m; i++) {for (int j = 0; j < n; j++) {if (matrix[i][j] == 0) { // 如果当前元素为 0row[i] = true; // 将对应的行标记为 truecol[j] = true; // 将对应的列标记为 true}}}// 第二次遍历,根据标记修改矩阵中的元素for (int i = 0; i < m; i++) {for (int j = 0; j < n; j++) {// 如果该行或该列需要置为 0,则将当前元素设置为 0if (row[i] || col[j]) {matrix[i][j] = 0; // 设置当前元素为 0}}}}
}

289. 生命游戏

class Solution {// 方法 gameOfLife 接收一个二维整数数组 board,表示细胞的当前状态public void gameOfLife(int[][] board) {// 创建一个数组来表示邻居的位置变化,邻居可以在横向、纵向和对角线int[] neighbors = {0, 1, -1}; int rows = board.length; // 获取行数int cols = board[0].length; // 获取列数// 创建一个复制数组 copyBoard,用于存储当前状态int[][] copyBoard = new int[rows][cols];// 从原数组复制一份到 copyBoard 中for (int row = 0; row < rows; row++) {for (int col = 0; col < cols; col++) {copyBoard[row][col] = board[row][col]; // 深拷贝细胞状态}}// 遍历面板中的每一个细胞for (int row = 0; row < rows; row++) {for (int col = 0; col < cols; col++) {// 统计当前细胞八个相邻细胞中的活细胞数量int liveNeighbors = 0;// 检查当前细胞的所有邻居for (int i = 0; i < 3; i++) { // 遍历邻居的行偏移for (int j = 0; j < 3; j++) { // 遍历邻居的列偏移// 排除当前细胞自身if (!(neighbors[i] == 0 && neighbors[j] == 0)) {int r = (row + neighbors[i]); // 计算邻居的行坐标int c = (col + neighbors[j]); // 计算邻居的列坐标// 检查邻居是否在矩阵内,并且是活细胞if ((r < rows && r >= 0) && (c < cols && c >= 0) && (copyBoard[r][c] == 1)) {liveNeighbors += 1; // 统计活细胞数量}}}}// 应用生命游戏规则:// 规则 1 或 规则 3:活细胞与少于 2 个或多于 3 个活邻居则死亡if ((copyBoard[row][col] == 1) && (liveNeighbors < 2 || liveNeighbors > 3)) {board[row][col] = 0; // 死亡}// 规则 4:死细胞有正好 3 个活邻居则复活if (copyBoard[row][col] == 0 && liveNeighbors == 3) {board[row][col] = 1; // 复活}}}}
}
http://www.lryc.cn/news/434136.html

相关文章:

  • Windows文件系统介绍与基本概念解析
  • 使用 Apache POI 实现 Java Word 模板占位符替换功能
  • 第三届人工智能与智能信息处理国际学术会议(AIIIP 2024)
  • 【动手学深度学习】04 数据操作 + 数据预处理(个人向笔记)
  • 本地搭建 Whisper 语音识别模型
  • 数据集成-缝合一套数据仓库Infra的臆想
  • 运营有哪几种?
  • Android视频编辑:利用FFmpeg实现高级功能
  • 图片无损缩放PhotoZoom Pro 9.0.2绿色版 +免费赠送PhotoZoom激活优惠代码
  • tekton pipelineresources
  • OFDM系统PAPR算法的MATLAB仿真,对比SLM,PTS以及CAF,对比不同傅里叶变换长度
  • 常见概念 -- 光回波损耗
  • uni-app环境搭建
  • 数据结构 栈 队列
  • 嵌入式学习路线+嵌入式校招建议 嵌入式学习面试规划
  • 服务器深度学习环境配置
  • 使用 Parallel 类进行多线程编码(下)
  • 基于微信小程序+Java+SSM+Vue+MySQL的药店管理系统
  • C#使用MQTT(一):MQTT服务端
  • AD原理图update为pcb
  • 应用海外仓系统后,可以改善哪些海外仓的核心业务流程?
  • SQL进阶技巧:截止当前批次前的批次量与订单量 | 移动窗口问题
  • C#中的Graphics类和SetQuality()自定义方法
  • 圣诞节:白酒与西式料理的异国风情
  • 2.ChatGPT的发展历程:从GPT-1到GPT-4(2/10)
  • yjs01——机器学习的过程
  • Git工作流程
  • Qt-QWidget的font属性(18)
  • Go语言概述
  • P6627 [省选联考 2020 B 卷] 幸运数字