力扣hot100--2

ops/2025/2/1 3:37:40/

文章目录

  • 力扣hot100-矩阵
    • 题目:矩阵置零
      • 题解
    • 题目:螺旋矩阵
      • 题解
    • 题目:旋转图像
      • 题解

力扣hot100-矩阵

题目:矩阵置零

原题链接:矩阵置零
在这里插入图片描述

题解

方法:通过先标记需要置为 0 的位置,再进行修改,避免了在遍历矩阵时直接更改元素,避免了覆盖掉尚未检查的元素。(先标记再置零

row[i] || col[j] 的意思就是:如果 第 i 行 或 第 j 列 中有任何一个被标记为需要置为 0,那么当前元素 matrix[i][j] 就应该被置为 0。

    public void setZeroes(int[][] matrix) {boolean[] row = new boolean[matrix.length];boolean[] col = new boolean[matrix[0].length];for (int i = 0; i < matrix.length; i++) {for (int j = 0; j < matrix[0].length; j++) {if (matrix[i][j] == 0) {row[i] = col[j] = true;}}}for (int i = 0; i < matrix.length; i++) {for (int j = 0; j < matrix[0].length; j++) {if (row[i] || col[j]) {matrix[i][j] = 0;}}}}

下面这个逻辑更清晰:

    public void setZeroes(int[][] matrix) {boolean[][] visited = new boolean[matrix.length][matrix[0].length];for (int i = 0; i < matrix.length; i++) {for (int j = 0; j < matrix[i].length; j++) {if (matrix[i][j] == 0) {// 行变为0rowToZero(matrix, i, visited);// 列变为0cloToZero(matrix, j, visited);}}}for (int i = 0; i < matrix.length; i++) {for (int j = 0; j < matrix[i].length; j++) {if (visited[i][j]) {matrix[i][j] = 0;}}}}private void rowToZero(int[][] matrix, int i, boolean[][] visited) {for (int j = 0; j < matrix[i].length; j++) {visited[i][j] = true;}}private void cloToZero(int[][] matrix, int j, boolean[][] visited) {for (int i = 0; i < matrix.length; i++) {visited[i][j] = true;}}

题目:螺旋矩阵

原题链接:螺旋矩阵
在这里插入图片描述

题解

思路解析:

  1. 定义边界:我们需要通过 4 个变量来维护矩阵的边界:

    • top:表示当前螺旋矩阵的上边界,初始化为 0。
    • bottom:表示当前螺旋矩阵的下边界,初始化为矩阵的最后一行索引。
    • left:表示当前螺旋矩阵的左边界,初始化为 0。
    • right:表示当前螺旋矩阵的右边界,初始化为矩阵的最后一列索引。
  2. 顺时针遍历:按照螺旋顺序进行遍历:

    • 从左到右:遍历 top 边界上的一行元素,然后 top++(即上边界下移)。
    • 从上到下:遍历 right 边界上的一列元素,然后 right--(即右边界左移)。
    • 从右到左:遍历 bottom 边界上的一行元素,然后 bottom--(即下边界上移)。
    • 从下到上:遍历 left 边界上的一列元素,然后 left++(即左边界右移)。
  3. 结束条件:遍历结束的条件是 top > bottomleft > right,即上下边界或左右边界错位。

每遍历一行或者一列,记得收缩相应的空间。(已经遍历的就不在遍历了)

public List<Integer> spiralOrder(int[][] matrix) {List<Integer> res = new ArrayList<>();int top = 0;int right = matrix[0].length - 1;int bottom = matrix.length - 1;int left = 0;while (left <= right && top <= bottom) {// 左到右// 边界是left right,i在范围里面移动。 保持行不变for (int i = left; i <= right; i++) {res.add(matrix[top][i]);}top++;// 上到下for (int i = top; i <= bottom; i++) {res.add(matrix[i][right]);}right--;// 右到左if (top <= bottom) {for (int i = right; i >= left; i--) {res.add(matrix[bottom][i]);}bottom--;}// 下到上if (left <= right) {for (int i = bottom; i >= top; i--) {res.add(matrix[i][left]);}left++;}}return res;}

题目:旋转图像

原题链接:旋转图像
在这里插入图片描述

题解

矩阵转置:将矩阵的行列互换得到的新矩阵称为转置矩阵。

1 2 3           1 4 7             7 4 1
4 5 6 ==转置==》 2 5 8 ==行反转==>  8 5 2
7 8 9           3 6 9             9 6 3
 public void rotate(int[][] matrix) {int n = matrix.length;// 1. 对角线翻转 矩阵转置for (int i = 0; i < n; i++) {for (int j = i; j < n; j++) {int temp = matrix[i][j];matrix[i][j] = matrix[j][i];matrix[j][i] = temp;}}// 2. 每一行反转for (int i = 0; i < n; i++) {int left = 0, right = n - 1;while (left < right) {int temp = matrix[i][left];matrix[i][left] = matrix[i][right];matrix[i][right] = temp;left++;right--;}}}


http://www.ppmy.cn/ops/154647.html

相关文章

20250124 Flink 增量聚合 vs 全量聚合

1. 增量聚合 vs 全量聚合 (1) 增量聚合&#xff08;ReduceFunction / AggregateFunction&#xff09; 工作方式&#xff1a; 逐步计算&#xff1a;每一条数据到达窗口时&#xff0c;立即与当前聚合结果结合&#xff0c;生成新的中间结果。 仅保存中间状态&#xff1a;内存中只…

活动回顾和预告|微软开发者社区 Code Without Barriers 上海站首场活动成功举办!

Code Without Barriers 上海活动回顾 Code Without Barriers&#xff1a;AI & DATA 深入探索人工智能与数据如何变革行业 2025年1月16日&#xff0c;微软开发者社区 Code Without Barriers &#xff08;CWB&#xff09;携手 She Rewires 她原力在大中华区的首场活动“AI &…

深入解析 C++17 中的 std::not_fn

文章目录 1. std::not_fn 的定义与目的2. 基本用法2.1 基本示例2.2 使用 Lambda 表达式2.3 与其他函数适配器的比较3. 在标准库中的应用3.1 结合标准库算法使用3.1.1 std::find_if 中的应用3.1.2 std::remove_if 中的应用3.1.3 其他标准库算法中的应用4. 高级技巧与最佳实践4.1…

pytorch实现半监督学习

半监督学习&#xff08;Semi-Supervised Learning&#xff0c;SSL&#xff09;结合了有监督学习和无监督学习的特点&#xff0c;通常用于部分数据有标签、部分数据无标签的场景。其主要步骤如下&#xff1a; 1. 数据准备 有标签数据&#xff08;Labeled Data&#xff09;&…

Redis内部数据结构--跳表详解

跳表 1. 什么是跳表--skiplist2. skiplist的效率如何保证3. 跳表的实现4. 跳表与平衡搜索树和哈希表的对比 1. 什么是跳表–skiplist skiplist本质上也是一种查找结构&#xff0c;用于解决算法中的查找问题&#xff0c;跟平衡搜索树和哈希表的价值是一样的&#xff0c;可以作为…

【事务管理】

目录 一. 介绍与操作二. Spring事务管理三. 事务四大特性 \quad 一. 介绍与操作 \quad \quad 二. Spring事务管理 \quad 推荐加在经常进行增删改的方法上 \quad 三. 事务四大特性 \quad ctrlaltt

实验一---典型环节及其阶跃响应---自动控制原理实验课

一 实验目的 1.掌握典型环节阶跃响应分析的基本原理和一般方法。 2. 掌握MATLAB编程分析阶跃响应方法。 二 实验仪器 1. 计算机 2. MATLAB软件 三 实验内容及步骤 利用MATLAB中Simulink模块构建下述典型一阶系统的模拟电路并测量其在阶跃响应。 1.比例环节的模拟电路 提…

python Flask-Redis 连接远程redis

当使用Flask-Redis连接远程Redis时&#xff0c;首先需要安装Flask-Redis库。可以通过以下命令进行安装&#xff1a; pip install Flask-Redis然后&#xff0c;你可以使用以下示例代码连接远程Redis&#xff1a; from flask import Flask from flask_redis import FlaskRedisa…