hot100-矩阵

news/2025/3/5 2:27:39/

240.搜索二维矩阵

编写一个高效的算法来搜索 mxn 矩阵 matrix 中的一个目标值 target 。该矩阵具有以下特性:

  • 每行的元素从左到右升序排列。

  • 每列的元素从上到下升序排列。

思路:

  1. 输入矩阵

    • 从标准输入读取矩阵的行数 n 和列数 m

    • 按行输入矩阵的元素。

  2. 搜索目标值

    • 使用从右上角开始的搜索策略:

      • 如果当前值等于目标值,返回 true

      • 如果当前值大于目标值,向左移动(列减1)。

      • 如果当前值小于目标值,向下移动(行加1)。

    • 如果超出矩阵边界仍未找到目标值,返回 false

java">import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner scanner = new Scanner(System.in);// 输入矩阵的行数和列数int n = scanner.nextInt();int m = scanner.nextInt();// 输入矩阵的元素int[][] matrix = new int[n][m];for (int i = 0; i < n; i++) {for (int j = 0; j < m; j++) {matrix[i][j] = scanner.nextInt();}}// 输入目标值int target = scanner.nextInt();// 调用 searchMatrix 方法搜索目标值boolean result = searchMatrix(matrix, target);// 输出结果System.out.println(result ? "true" : "false");}/*** 在有序矩阵中搜索目标值* @param matrix 有序矩阵* @param target 目标值* @return 是否找到目标值*/public static boolean searchMatrix(int[][] matrix, int target) {int n = matrix.length; // 行数int m = matrix[0].length; // 列数int row = 0; // 初始化行指针为第一行int col = m - 1; // 初始化列指针为最后一列while (row < n && col >= 0) {if (matrix[row][col] == target) {return true;} // 如果当前元素大于目标值,说明目标值可能在当前列的左边else if (matrix[row][col] > target) {col--; // 向左移动} else {row++; // 向下移动}}return false;}
}

 

73. 矩阵置零

给定一个 mxn矩阵,如果一个元素为 0 ,则将其所在行和列的所有元素都设为 0 。请使用 原地 算法

思路:

遍历矩阵的每个元素,找到所有需要置零的行和列,遍历 row 列表中的每个行索引将记录的行置零,遍历 coloum 列表中的每个列索引将该列的所有元素置为 0

java">class Solution {public void setZeroes(int[][] matrix) {int n = matrix.length;       // 行数int m = matrix[0].length;    // 列数
​// 使用两个列表分别记录需要置零的行索引和列索引List<Integer> row = new ArrayList<>();    // 存储需要置零的行索引List<Integer> coloum = new ArrayList<>(); // 存储需要置零的列索引
​// 遍历矩阵,找到所有值为0的元素,并记录它们所在的行和列索引for (int i = 0; i < n; i++) {for (int j = 0; j < m; j++) {if (matrix[i][j] == 0) { row.add(i);          // 记录该行索引coloum.add(j);       // 记录该列索引}}}
​// 遍历记录的行索引,将对应行的所有元素置为0for (Integer r : row) {for (int i = 0; i < m; i++) {matrix[r][i] = 0;        }}
​// 遍历记录的列索引,将对应列的所有元素置为0for (Integer c : coloum) {for (int i = 0; i < n; i++) { matrix[i][c] = 0;       }}}
}

优化:利用矩阵的第一行和第一列记录需要置零的行和列,避免了额外的空间开销,同时保持了时间复杂度为 O(n×m)。这种方法在处理大规模矩阵时尤其高效。

java">class Solution {public void setZeroes(int[][] matrix) {int n = matrix.length;       // 行数int m = matrix[0].length;    // 列数
​boolean firstRowZero = false; // 标记第一行是否需要置零boolean firstColZero = false; // 标记第一列是否需要置零
​// 遍历矩阵,记录需要置零的行和列for (int i = 0; i < n; i++) {for (int j = 0; j < m; j++) {if (matrix[i][j] == 0) {// 如果第一行有0,标记第一行需要置零if (i == 0) {firstRowZero = true;}// 如果第一列有0,标记第一列需要置零if (j == 0) {firstColZero = true;}// 使用第一行和第一列记录需要置零的行和列matrix[i][0] = 0;matrix[0][j] = 0;}}}
​// 根据第一行和第一列的标记,置零对应的行和列// 跳过第一行和第一列,避免重复置零for (int i = 1; i < n; i++) {for (int j = 1; j < m; j++) {if (matrix[i][0] == 0 || matrix[0][j] == 0) {matrix[i][j] = 0;}}}
​// 如果第一行需要置零if (firstRowZero) {for (int j = 0; j < m; j++) {matrix[0][j] = 0;}}
​// 如果第一列需要置零if (firstColZero) {for (int i = 0; i < n; i++) {matrix[i][0] = 0;}}}
}

54. 螺旋矩阵

给你一个 mn 列的矩阵 matrix ,请按照 顺时针螺旋顺序 ,返回矩阵中的所有元素。

思路:记录四个变量上下左右的边界值,每次循环走四条边。

java">class Solution {public List<Integer> spiralOrder(int[][] matrix) {List<Integer> list = new ArrayList<>(); // 用于存储螺旋顺序的结果
​int left = 0;       // 左边界int top = 0;        // 上边界int down = matrix.length - 1; // 下边界int right = matrix[0].length - 1; // 右边界
​// 当左边界小于等于右边界,且上边界小于等于下边界时,继续循环while (left <= right || top <= down) {// 从左到右遍历上边界for (int i = left; i <= right && top <= down; i++) {list.add(matrix[top][i]); }top++; // 上边界下移
​// 从上到下遍历右边界for (int i = top; i <= down && left <= right; i++) {list.add(matrix[i][right]); }right--; // 右边界左移
​// 从右到左遍历下边界for (int i = right; i >= left && top <= down; i--) {list.add(matrix[down][i]); }down--; // 下边界上移
​// 从下到上遍历左边界for (int i = down; i >= top && left <= right; i--) {list.add(matrix[i][left]); }left++; // 左边界右移}
​return list; }
}

48. 旋转图像

给定一个 n × n 的二维矩阵 matrix 表示一个图像。请你将图像顺时针旋转 90 度。

你必须在原地 旋转图像,这意味着你需要直接修改输入的二维矩阵请不要 使用另一个矩阵来旋转图像。

思路:

1. 上下翻转矩阵

  • 目的:将矩阵的第一行与最后一行交换,第二行与倒数第二行交换,依此类推。

  • 实现

    • 使用一个临时数组 temp 保存当前行。

    • 将当前行替换为对应的倒数行。

    • 将倒数行替换为临时数组 temp

2. 转置矩阵

  • 目的:将矩阵的行和列互换,即 matrix[i][j]matrix[j][i] 互换。

  • 实现

    • 遍历矩阵的上三角部分(j < i),因为下三角部分会在转置过程中被覆盖。

    • 使用一个临时变量 temp 保存当前元素。

    • 交换 matrix[i][j]matrix[j][i]

java">class Solution {public void rotate(int[][] matrix) {int n = matrix.length; // 获取矩阵的大小
​// 第一步:上下翻转矩阵// 将矩阵的第一行与最后一行交换,第二行与倒数第二行交换,依此类推for (int i = 0; i < n / 2; i++) {int[] temp = matrix[i];                // 临时存储当前行matrix[i] = matrix[n - i - 1];         // 将当前行替换为对应的倒数行matrix[n - i - 1] = temp;              // 将倒数行替换为临时存储的当前行}
​// 第二步:转置矩阵// 将矩阵的行和列互换,即 matrix[i][j] 和 matrix[j][i] 互换for (int i = 0; i < n; i++) {for (int j = 0; j < i; j++) {          // 只需遍历矩阵的上三角部分int temp = matrix[i][j];           // 临时存储当前元素matrix[i][j] = matrix[j][i];       // 将当前元素替换为对应的转置元素matrix[j][i] = temp;               // 将转置元素替换为临时存储的当前元素}}}
}


http://www.ppmy.cn/news/1576706.html

相关文章

QT——文件IO

QFile 类 构造函数 QFile() 无参构造 仅仅构建一个QFile 对象&#xff0c;不设定文件名 QFile(文件名) 构建一个QFile对象的同时&#xff0c;设定文件名 但是注意&#xff0c;仅仅设定文件名&#xff0c;并不会打开该文件 设定文件名 QFile file file.setFileName…

苹果廉价机型 iPhone 16e 影像系统深度解析

【人像拍摄差异】 尽管iPhone 16e支持后期焦点调整功能&#xff0c;但用户无法像iPhone 16系列那样通过点击屏幕实时切换拍摄主体。前置摄像头同样缺失人像深度控制功能&#xff0c;不过TrueTone原彩闪光灯系统在前后摄均有保留。 很多人都高估了 iPhone 的安全性&#xff0c;查…

C 语言在微软平台:经典与创新的交融

在编程语言的璀璨星空中&#xff0c;C 语言犹如一颗耀眼的恒星&#xff0c;散发着永恒的光芒。当这颗恒星与微软强大的平台相互辉映时&#xff0c;更是碰撞出了绚丽多彩的火花&#xff0c;构建起了一个充满无限可能的编程世界。 C 语言与微软平台的深厚渊源 C 语言诞生于 20 …

Spark任务用什么提交的

spark任务提交的方式有很多种&#xff1a; 1、使用spark_shell&#xff1a;日常做一些简单的测试&#xff0c;使用spark-shell命名就可以&#xff0c;然后通过scala语言进行查询处理 /home/hadoop/app/spark-2.2.0-bin-2.6.0-cdh5.7.0/bin/spark-shell \ > --master spark:…

HarmonyOS学习第13天:布局进阶,从嵌套到优化

布局嵌套初体验 在 HarmonyOS 应用开发中&#xff0c;布局嵌套是构建复杂界面的重要手段。就像搭建一座高楼&#xff0c;布局嵌套能让各个界面元素有序组合&#xff0c;构建出功能丰富、层次分明的用户界面。我们以日常使用的电商 APP 为例&#xff0c;在商品展示区&#xff0c…

Kafka 主题 retention.ms 配置修改及深度问题排查指南

文章目录 Kafka 主题 retention.ms 配置修改及深度问题排查指南版本背景查看 Kafka 主题当前状态修改 retention.ms 配置的正确方式为什么不能使用 kafka-topics.sh&#xff1f;使用 kafka-configs.sh 动态更新配置 深入解析 retention 配置retention.ms 与 retention.bytes 的…

Kotlin观察者模式

观察者模式是一种设计模式&#xff0c;它定义了对象之间的一对多依赖关系&#xff0c;当一个对象改变状态时&#xff0c;所有依赖于它的对象都会得到通知并自动更新。这种模式在许多编程场景中非常有用&#xff0c;例如事件处理、数据绑定和通知系统。 观察者模式的主要组成部…

Android中的四大组件及其生命周期

Android中的四大组件分别是Activity、Service、Content Provider和BroadcastReceiver&#xff0c;每个组件都有其特定的生命周期。以下是这些组件及其生命周期的详细介绍&#xff1a; 1. Activity 简介&#xff1a;Activity是用户操作的可视化界面&#xff0c;为用户提供了一个…