leetcode—矩阵

1 矩阵置零

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

示例 1:

输入:matrix = [[1,1,1],[1,0,1],[1,1,1]]
输出:[[1,0,1],[0,0,0],[1,0,1]]

方法一:

使用标记数组

  1. 新建两个标记数组 row column
  2. 第一次遍历数组 记录数组中每一行 每一列 中的值是否为0
  3. 第二次遍历数组 将数组中0所在的行和列设置为0

class Solution {
    public void setZeroes(int[][] matrix) {
        int m = matrix.length;
        int n = matrix[0].length;

        // 新建两个数组  记录二维数组的每一行和每一列是否为零
        boolean[] row = new boolean[m];
        boolean[] column = new boolean[n];

        // 第一次遍历二维数组 标记他的每一行 每一列是否为0
        for(int i = 0; i < m; i++){
            for(int j = 0; j < n; j++){
                if(matrix[i][j] == 0){
                    row[i] = column[j] = true;
                }
            }
        }

        // 第二次遍历数组 将0所在的行和列设置为0
        for(int i = 0; i < m; i++){
            for(int j = 0; j < n; j++){
                if(row[i] == true || column[j] == true){
                    matrix[i][j] = 0;
                }
            }
        }
    }
}

2 螺旋矩阵

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

示例 1:

输入:matrix = [[1,2,3],[4,5,6],[7,8,9]]
输出:[1,2,3,6,9,8,7,4,5]

方法:

按层模拟,首先输出最外层的元素,其次输出次外层的元素,直到输出最内层的元素

class Solution {
    public List<Integer> spiralOrder(int[][] matrix) {
        List<Integer> order = new ArrayList<>();
        // 数组判空
        if(matrix == null || matrix.length == 0 || matrix[0].length == 0){
            return order;
        }
        int row = matrix.length;
        int column  = matrix[0].length;

        int left = 0;
        int right = column - 1;
        int top = 0;
        int bottom = row - 1;

        // 螺旋矩阵循环入口
        while(left <= right && top <= bottom){
            // 从左到右遍历上侧元素
            for(int colu = left; colu <= right; colu++){
                order.add(matrix[top][colu]);
            }
            // 从上到下遍历右侧元素
            for(int row1 = top +1; row1 <= bottom; row1++){
                order.add(matrix[row1][right]);
            }

            if(left < right && top < bottom){
                // 从右到左遍历下侧元素
                for(int colu = right -1; colu > left; colu--){
                    order.add(matrix[bottom][colu]);
                }
                // 从下到上遍历左侧元素
                for(int row2 = bottom; row2 > top; row2--){
                    order.add(matrix[row2][left]);
                }
            }
            left++;
            right--;
            top++;
            bottom--;
        }
        return order;
    }
}

3 旋转图像

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

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

示例 1:

输入:matrix = [[1,2,3],[4,5,6],[7,8,9]]
输出:[[7,4,1],[8,5,2],[9,6,3]]

方法一:

借助辅助数组

 原数组中第i行第j个元素  旋转后再数组中的位置变为  倒数第i列第j个位置

数组下标从0开始

[row][col]  旋转后 —> [col][n-row-1]

  1. 第一次遍历数组,将数组旋转之后的值存储在辅助数组中
  2. 第二次遍历数组,将辅助数组中的值赋值给原数组
class Solution {
    public void rotate(int[][] matrix) {
        // 获取数组的长度 n*n
        int n = matrix.length;
        // 新建辅助数组
        int[][] newMatrix = new int[n][n];

        // 第一次遍历数组 将旋转后的值存储在辅助数组中
        for(int row = 0; row < n; row++){
            for(int col = 0; col < n; col++){
                newMatrix[col][n - row - 1] = matrix[row][col];
            }
        }

        // 第二次遍历数组,将辅助数组中的值赋值给原数组
        for(int i = 0; i < n; i++){
            for(int j = 0; j < n; j++){
                matrix[i][j] = newMatrix[i][j];
            }
        }
    }
}

方法二:

原地旋转矩阵

 一轮可以完成矩阵的四个元素的旋转

故:只要分别以矩阵左上角1/4的铬元素为其实点执行以上操作,即可完成矩阵旋转

  • 当n为偶数时,取前n/2行,n/2列的元素为起点
  • 当n为奇数时,取前n/2行,(n+1)/ 2列的元素为起点

 

class Solution {
    public void rotate(int[][] matrix) {
       // 原地旋转矩阵
       // 获取数组长度
       int n = matrix.length;

       // 旋转数组 一轮可以完成矩阵中四个元素的交换
       for(int i = 0; i < n/2; i++){
           for(int j = 0; j < (n+1)/2; j++){
               int temp = matrix[i][j];
               matrix[i][j] = matrix[n-j-1][i];
               matrix[n-j-1][i] = matrix[n-i-1][n-j-1];
               matrix[n-i-1][n-j-1] = matrix[j][n-i-1];
               matrix[j][n-i-1] = temp;
           }
       }
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/329023.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

知识库建设教程来啦,赶紧收藏起来

播种知识&#xff0c;收获效率。知识库&#xff0c;这个企业内部服务的“大百科”&#xff0c;可能是你下一步需要建立的重要工具哦&#xff01;今天&#xff0c;就让我们一起来看一下如何进行知识库的建设和维护。 首先&#xff0c;让我们理解一下知识库的定义。知识库就像是一…

探索Python数据结构与算法:解锁编程的无限可能

文章目录 一、引言1.1 数据结构与算法对于编程的重要性1.2 Python作为实现数据结构与算法的强大工具 二、列表和元组2.1 列表&#xff1a;创建列表、索引、切片和常用操作2.2 元组&#xff1a;不可变序列的特性和使用场景 三、字符串操作和正则表达式3.1 字符串的常见操作和方法…

第36期 | GPTSecurity周报

GPTSecurity是一个涵盖了前沿学术研究和实践经验分享的社区&#xff0c;集成了生成预训练Transformer&#xff08;GPT&#xff09;、人工智能生成内容&#xff08;AIGC&#xff09;以及大型语言模型&#xff08;LLM&#xff09;等安全领域应用的知识。在这里&#xff0c;您可以…

c语言-库函数strstr()、strtok()、strerror()介绍

文章目录 前言一、库函数strstr()1.1 strstr()介绍1.2 strstr()模拟实现 二、库函数strtok()2.1 strtok()介绍 三、库函数strerror()3.1 strerror()介绍 总结 前言 本篇文章介绍c语言库函数strstr()、strtok()、strerror()的使用。 一、库函数strstr() 1.1 strstr()介绍 str…

Linux/Networked

Enumeration nmap 网站更新之后有了一个引导模式&#xff0c;更利于学习了&#xff0c;之前看ippsec的视频&#xff0c;要不总是没有思路&#xff0c;现在出现的问题多了提示也更多了&#xff0c;还没有使用&#xff0c;一会用用再说 首先&#xff0c;第一个问题是“目标上正…

RocketMQ源码阅读-Producer消息发送

RocketMQ源码阅读-Producer消息发送 1. 从单元测试入手2. 启动过程3. 同步消息发送过程4. 异步消息发送过程5. 小结 Producer是消息的生产者。 Producer和Consummer对Rocket来说都是Client&#xff0c;Server是Broker。 客户端在源码中是一个单独的Model&#xff0c;目录为rock…

WordPress后台仪表盘自定义添加删除概览项目插件Glance That

成功搭建WordPress站点&#xff0c;登录后台后可以在“仪表盘 – 概览”中看到包括多少篇文章、多少个页面、多少条评论和当前WordPress版本号及所使用的主题。具体如下图所示&#xff1a; 但是如果我们的WordPress站点还有自定义文章类型&#xff0c;也想在概览中显示出来应该…

《计算机视觉处理设计开发工程师》

计算机视觉&#xff08;Computer Vision&#xff09;是一门研究如何让计算机能够理解和分析数字图像或视频的学科。简单来说&#xff0c;计算机视觉的目标是让计算机能够像人类一样对视觉信息进行处理和理解。为实现这个目标&#xff0c;计算机视觉结合了图像处理、机器学习、模…

我的年终总结2023

As a DBA 从2023年初开始&#xff0c;我就给自己定下了23年的主要任务——学习PostgreSQL数据库。虽然没有定下细致的计划&#xff0c;但总体的目标是把PG的一些基础知识学完。后来发现我想简单了&#xff0c;学习PG的成本比我想象的多的多&#xff0c;导致23年这个目标没有完…

【CSP】2023年12月真题练习(更新到202312-2)

试题编号&#xff1a;202312-1试题名称&#xff1a;仓库规划时间限制&#xff1a;1.0s内存限制&#xff1a;512.0MB问题描述&#xff1a; 问题描述 西西艾弗岛上共有 n 个仓库&#xff0c;依次编号为 1⋯n。每个仓库均有一个 m 维向量的位置编码&#xff0c;用来表示仓库间的物…

汽车生产污废水处理需要哪些工艺设备

对于汽车生产过程中产生的污废水处理&#xff0c;需要运用一系列的工艺设备来实现有效的清洁和回收利用。下面让我们一起来探索一下吧&#xff01; 首先&#xff0c;汽车生产工艺设备中最常见的是物理处理设备。物理处理包括沉淀、过滤和吸附等过程。其中&#xff0c;沉淀操作可…

Angular系列教程之观察者模式和RxJS

文章目录 引言RxJS简介RxJS中的设计模式观察者模式迭代器模式 示例代码RxJS 在 Angular 中的应用总结 引言 在Angular开发中&#xff0c;我们经常需要处理异步操作&#xff0c;例如从后端获取数据或与用户的交互。为了更好地管理这些异步操作&#xff0c;Angular中引入了RxJS&…

Java、C#、Python间的Battle

一、编译原理和开发效率 编译速度&#xff1a; C# &#xff08;约大于等于&#xff09; JAVA > Python python的编译原理 前提&#xff1a;python 3.6 python不会直接编译源码 而是把源码直接扔给解释器&#xff0c;这种方式 使得python非常灵活&#xff0c;让它的开发效…

从零开始:生产环境如何部署 Bytebase

Bytebase 是面向研发和 DBA 的数据库 DevOps 和 CI/CD 协同平台。目前 Bytebase 在全球类似开源项目中 GitHub Star 数排名第一且增长最快。 Bytebase 的架构 Bytebase 是一个单体架构 (monolith)&#xff0c;前端是 Vue3 TypeScript&#xff0c;后端是 Go。前端利用 Go 1.6 …

好用的内外网快速传输大文件方法

在信息化时代&#xff0c;数据已经成为各行各业的关键资产&#xff0c;数据的传输和交换方式直接影响着数据价值的体现。在众多场景下&#xff0c;我们需要在不同的网络环境中进行文件传输&#xff0c;如同一个局域网内或者互联网上。这时涉及到内外网的概念。 内外网指的是在不…

UE5 nDisplay群集事件的发送和接收

注意&#xff1a; 1.只能在投屏模式下生效 2.需要监听的机器都要执行“1.打开监听”

创意无限!亲测可用的免费Photoshop素材网站大揭秘!

高质量的PS材料可以保证设计师设计作品的质量&#xff0c;但很多人不知道在哪里找到一些免费的材料&#xff0c;尤其是对初学者来说。那么&#xff0c;有没有质量好、免费的PS材料网站呢&#xff1f;别担心&#xff0c;现在就告诉你。 即时设计 被很多人视为免费的PS素材网站…

likeshop知识付费系统PHP版v1.4.0

✅ 新增功能 题库功能 ⚡ 功能优化 数据库检测优化 订单中心页优化 系统-登录时效优化 &#x1f41e; 功能修复 详情页佣金可见设置未生效 更新内容说明 1.题库 题库功能的引入&#xff0c;不仅仅是对学习方式的一次革新&#xff0c;更是为广大用户提供了更多更丰富的学…

【运维】WSL1如何升级到WSL2

升级WSL1到WSL2&#xff1a;简便快捷版 在这篇博客中&#xff0c;我们将研究如何通过一种更简便的方式&#xff0c;将WSL1迅速升级到WSL2&#xff0c;避免官方文档的繁冗步骤。如果你觉得官方方法太过冗长&#xff0c;那么这里提供的步骤可能更适合你。 官网的办法是&#xf…

GaussDB(DWS)查询优化技术大揭秘

GaussDB(DWS)查询优化技术大揭秘 大数据时代&#xff0c;数据量呈爆发式增长&#xff0c;经常面临百亿、千亿数据查询场景&#xff0c;当数据仓库数据量较大、SQL语句执行效率低时&#xff0c;数据仓库性能会受到影响。本文将深入讲解在GaussDB(DWS)中如何进行表结构设计&#…