leetcode 矩阵专题——java实现

news2024/9/22 21:31:35

73. 矩阵置零

给定一个 m x n 的矩阵,如果一个元素为 0 ,则将其所在行和列的所有元素都设为 0 。请使用 原地 算法。
输入:matrix = [[1,1,1],[1,0,1],[1,1,1]]
输出:[[1,0,1],[0,0,0],[1,0,1]]
关键在于:一次扫描全表记录为0的坐标,然后对记录的坐标整行整列赋值0

class Solution {
    public void setZeroes(int[][] matrix) {
        int n=matrix.length,m=matrix[0].length;
        int[] x=new int[202];
        int[] y=new int[202];
        int x1=0,y1=0;
        for(int i=0;i<n;i++){
            for(int j=0;j<m;j++){
                if(matrix[i][j]==0){
                    //记录为0点的坐标
                    x[x1++]=i;
                    y[y1++]=j;
                    System.out.println(i+j);
                }
            }
        }

        //记录的坐标
        for(int i=0;i<x1;i++){
            int xx=0;
            while(xx<m){
                //行=0
                matrix[x[i]][xx++]=0;
            }
            int yy=0;
            while(yy<n){
                //列=0
                System.out.println("yy"+yy+y[i]);
                int a=yy,b=y[i];
                // matrix[a][b]=0;
                matrix[yy][y[i]]=0;
                
                yy++;
            }
        }
    }
}

54. 螺旋矩阵

给你一个 m 行 n 列的矩阵 matrix ,请按照 顺时针螺旋顺序 ,返回矩阵中的所有元素。
输入: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> list=new ArrayList<Integer>();
        int n=matrix.length,m=matrix[0].length;
        int[][] map = new int[n][m];
        int next[][]={{0,1},{1,0},{0,-1},{-1,0}};//右下左上顺时针
        int x=0,y=0,k=0;
        for(int i=1;i<=n*m;i++)//这个循环只是表明要走n*n步而已
        {
            list.add(matrix[x][y]);
            map[x][y]=-1;//访问后标记
            int tx=x+next[k][0];
            int ty=y+next[k][1];//下一个位置
            if(tx<0||ty<0||tx>=n||ty>=m||map[tx][ty]==-1)//下一个位置到达边界条件
            {
                k=(k+1)%4;//转换方向
                tx=x+next[k][0];//新的下一位置
                ty=y+next[k][1];
            }
            x=tx;y=ty;//确定的下一步的位置
        }
        return list;

    }
}

59. 螺旋矩阵 II

给你一个正整数 n ,生成一个包含 1 到 n2 所有元素,且元素按顺时针顺序螺旋排列的 n x n 正方形矩阵 matrix 。
输入:n = 3
输出:[[1,2,3],[8,9,4],[7,6,5]]
在这里插入图片描述
本质就是模拟填数的过程。
但一下代码耗时长

class Solution {
    public int[][] generateMatrix(int n) {
        int[][] map = new int[n][n];
        
        int x=0,y=0,k=0;
        int[][] next={{0,1},{1,0},{0,-1},{-1,0}};//转向顺序:右、下、左、上
        for(int i=1;i<=n*n;i++){
            System.out.println(x+"y"+y+"i"+i);
            map[x][y]=i;
            int tx=x+next[k][0];
            int ty=y+next[k][1];
            if(tx<0||ty<0||tx>=n||ty>=n||map[tx][ty]!=0){
                //转向
                k=(k+1)%4;
                tx=x+next[k][0];
                ty=y+next[k][1];
            }
            x=tx;
            y=ty;
            
        }
        return map;

    }
}

48. 旋转图像

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

你必须在 原地 旋转图像,这意味着你需要直接修改输入的二维矩阵。请不要 使用另一个矩阵来旋转图像。
输入:matrix = [[1,2,3],[4,5,6],[7,8,9]]
输出:[[7,4,1],[8,5,2],[9,6,3]]

关键在于:找到规律,进行先矩阵转置(就是[i][j],[j][i]互换),再左右对称的两列互换。

class Solution {
    public void rotate(int[][] matrix) {
        //先矩阵转置,再左右对称的两列互换

        int n=matrix.length;
        //转置(i,j互换)
        for(int i=0;i<n;i++){//对一半进行操作
            for(int j=0;j<i;j++){
                int tmp = matrix[i][j];
                matrix[i][j]=matrix[j][i];
                matrix[j][i]=tmp;
            }
        }
        //交换两列
        for(int i=0;i<n;i++){
            for(int j=0;j<n/2;j++){
                int tmp = matrix[i][j];
                matrix[i][j]=matrix[i][n-1-j];
                matrix[i][n-1-j]=tmp;
            }
        }
    }
}

240. 搜索二维矩阵 II

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

每行的元素从左到右升序排列。
每列的元素从上到下升序排列
在这里插入图片描述
输入:matrix = [[1,4,7,11,15],[2,5,8,12,19],[3,6,9,16,22],[10,13,14,17,24],[18,21,23,26,30]], target = 5
输出:true

从右上角看是一颗二叉搜索树
然后就二分查找

class Solution {
    public boolean searchMatrix(int[][] matrix, int target) {
        //[i+1][j],[i][j+1]<  [i+1][j+1]
        int n=matrix.length,m=matrix[0].length;
        int i=0,j=m-1;
        //从右上角开始
        while(i<n&&j>=0){
            if(matrix[i][j]==target) return true;
            if(target>matrix[i][j])i++;
            else j--;
        }
        return false;

    }
}

注:一开始由于我总想着通过关键点[i+1]][j+1]的比较,来找到特定的行和列,而导致错误,实际上不能确定行列只能排除左上角。

74. 搜索二维矩阵

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

每行中的整数从左到右按非严格递增顺序排列。
每行的第一个整数大于前一行的最后一个整数。
给你一个整数 target ,如果 target 在矩阵中,返回 true ;否则,返回 false 。
输入:matrix = [[1,3,5,7],[10,11,16,20],[23,30,34,60]], target = 3
输出:true

做完上题再看这题,很自然就从右上角看到了二叉搜索树,按照同样的思路用二分查找。

class Solution {
    public boolean searchMatrix(int[][] matrix, int target) {
        //非严格递增就是可以相等
         int n=matrix.length,m=matrix[0].length;
        int i=0,j=m-1;
        //从右上角开始
        while(i<n&&j>=0){
            if(matrix[i][j]==target) return true;
            if(target>matrix[i][j])i++;
            else j--;
        }
        return false;
    }
}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Java高级Day18-集合

62.集合 之前保存多个数据元素使用数组&#xff0c;但数组有以下缺点&#xff1a; 长度开始必须指定&#xff0c;指定后不可修改 保存的必须为同一类型的元素 使用数组进行增加/删除元素的代码比较麻烦 集合 可以动态的保存任意多个对象 提供了一系列方便操作对象的方法 …

基于IDEA+Mysql+SpringBoot开发的健康运动系统

基于IDEAMysqlSpringBoot开发的健康运动系统 项目介绍&#x1f481;&#x1f3fb; http://localhost:8088/login.html 账号密码 xpf 123 在当前快节奏的社会生活中&#xff0c;随着人们健康意识的不断提升&#xff0c;个人健康管理已成为社会关注的焦点。随着科技的飞速发展&am…

反爬虫限制:有哪些方法可以保护网络爬虫不被限制?

目前&#xff0c;爬虫已经成为互联网数据获取最主流的方式。但为了保证爬虫顺利采集数据&#xff0c;需要防范网站的反爬虫机制&#xff0c;降低IP被限制的风险&#xff0c;这样才能提高爬虫工作的效率。那么&#xff0c;如何防止网络爬虫被限制呢&#xff1f;下面介绍几种有效…

在亚马逊云科技AWS上利用RAG搭建一个向量库云原生AI对话机器人

简介&#xff1a; 小李哥将继续每天介绍一个基于亚马逊云科技AWS云计算平台的全球前沿AI技术解决方案&#xff0c;帮助大家快速了解国际上最热门的云计算平台亚马逊云科技AWS AI最佳实践&#xff0c;并应用到自己的日常工作里。 本次介绍的是如何利用亚马逊云科技一系列热门A…

昇思25天学习打卡营第16天|Diffusion扩散模型,DCGAN生成漫画头像

Diffusion扩散模型 关于扩散模型&#xff08;Diffusion Models&#xff09;有很多种理解&#xff0c;本文的介绍是基于denoising diffusion probabilistic model &#xff08;DDPM&#xff09;&#xff0c;DDPM已经在&#xff08;无&#xff09;条件图像/音频/视频生成领域取得…

7.30 模拟赛总结 [神奇性质]+[线段树二分]

复盘 7:40 成功开题&#xff0c;艾教场 看 T1&#xff0c;感觉很神奇&#xff0c;但看数据范围没有开到 1 e 9 1e9 1e9 之类的&#xff0c;应该是得怎么搜一下&#xff1b;T2 发现做过原题&#xff0c;秒了&#xff1b;T3 第一眼没看懂题&#xff0c;推样例始终不理解其中的…

使用Leaflet GeoMan结合天地图进行自由标绘实战

目录 前言 一、Leaflet GeoMan是什么 1、关于Leaflet GeoMan 2、关于开源版和企业版 3、相关的方法介绍 二、使用Geoman来进行自由标绘实战 1、相关资源准备 2、新建html网页 3、初始化地图及绑定Geoman控件 三、自由标绘的成果 1、整体效果 2、添加空间对象 3、开…

语音交互、AI问答,等你来体验!

功能背景 在实际大屏应用中&#xff0c;用户向大屏直接下达语音指令显的越来越便捷&#xff0c;其中体现的交互感也比通过动作指令来的更加强烈&#xff0c;给用户带来更高效的服务体验。目前EasyV平台开发的自定义事件交互已经很完善&#xff0c;组件之间可以进行触发联动。 …

python 装饰器及使用场景

1. 装饰器的理解 上面这种用装饰器的效果和下面这种是一样的&#xff0c;两个圈起来的是等价的&#xff0c;只是写法不一样&#xff0c;用装饰器函数 更简洁一些。 总的来说&#xff0c;装饰器的作用是&#xff1a;当定义一个函数的时候&#xff0c;通过在其上面加上装饰器&…

C:关于位操作符:、|、^、~的一些应用

一些用来熟悉位操作符的应用 一、按位异或&#xff1a;^ 异或运算&#xff1a;相同为0&#xff0c;相异为1 应用&#xff1a;在不引入临时变量&#xff08;第三变量&#xff09;的情况下&#xff0c;实现两个整数的交换。 关于两个整数交换&#xff0c;我们有一些方法&…

Docker Compose部署项目+使用

目录结构 - suggestion/- backend/ # 我的后端项目- app.py- other_files/- docker-compose.yml- Dockerfile- requirements.txt获得requirements.txt 命令行输入&#xff1a;pip list --formatfreeze > requirements.txt 因为使用 pip freeze > requirements.txt 导出…

创建了Vue项目,需要导入什么插件以及怎么导入

如果你不知道怎么创建Vue项目,建议可以看一看这篇文章 怎么安装Vue的环境和搭建Vue的项目-CSDN博客 1.在idea中打开目标文件 2.系在一个插件Vue.js 3.下载ELement UI 在Terminal中输入 # 切换到项目根目录 cd vueadmin-vue # 或者直接在idea中执行下面命令 # 安装element-u…

漏洞打靶-tomato

这是一个很有意思的靶场&#xff0c;靶机的安装过程请参考我的文章“漏洞打靶-hackme”&#xff0c;进入靶场后&#xff0c;迎面而来的就是一个大tomato&#xff0c;然后就无从下手了&#xff0c;查目录查不出来&#xff0c;sql注入也没地方注入 这时候我们可以用kali的nmap去查…

ARM学习(29)NXP 双coreMCU MCXN94学习

笔者来介绍一下NXP 双core板子 &#xff0c;新系列的mcxn94 1、MCX 新系列介绍 恩智浦 MCU 系列产品包括 Kinetis 、LPC 系列&#xff0c;以及 i.MX RT 系列&#xff0c;现在又推出新系列产品 MCX 产品&#xff0c;包括四个系列&#xff0c;目前已经发布产品的是 MCX N 系列。…

第十四天7.25(git)

1.git 1.git功能特性 1.克隆数据库版本&#xff1a;从服务器上克隆数据库本机上 2.提交代码&#xff1a;在本机上自己创建的分支上提交代码 3.合并分支&#xff1a;在本机上合并分支 4.拉取合并分支&#xff1a;新建一个分支&#xff0c;把服务器上最新的代码Fetch下来&…

微软工具合集 | Microsoft PowerToys v0.83.0

PowerToys是由微软开发的一款免费系统工具集&#xff0c;专为Windows 10和Windows 11系统设计。它提供了一系列高效实用的工具&#xff0c;旨在帮助用户提升操作系统的使用效率和个性化程度。PowerToys工具集深受系统管理员和高级用户的喜爱&#xff0c;通过集成多种工具&#…

XXE -靶机

XXE靶机 一.扫描端口 进入xxe靶机 1.1然后进入到kali里 使用namp 扫描一下靶机开放端口等信息 1.2扫描他的目录 二 利用获取的信息 进入到 robots.txt 按他给出的信息 去访问xss 是一个登陆界面 admin.php 也是一个登陆界面 我们访问xss登陆界面 随便输 打开burpsuite抓包 发…

《深入浅出WPF》学习笔记二.为对象属性赋值的三种方式

《深入浅出WPF》学习笔记二.为对象属性赋值的三种方式 WPF用户图形界面是树状结构 &#x1f446;wpf文档大纲 &#x1f446;winform文档大纲 wpf的用户图形界面是树状结构&#xff0c;与winform不同点在于&#xff0c;winform同样存在树状结构的控件(比如panel、gridcontrol等…

Wi-Fi、WLAN、Bluetooth、zigbee、蜂窝网络、4g5g、MQTT

为什么打开手机的WiFi连接&#xff0c;显示的是WLAN&#xff1f; 分清Wi-Fi、WLAN、Bluetooth、zigbee、蜂窝网络、4g5g、MQTT这些概念. 一、WLAN、WIFI、WAPI WLAN是利用无线通信技术在局部区域内构建的网络&#xff0c;家庭/办公室里的网络就是一个WLAN&#xff0c;WLAN是一…