LeetCode 热题 100 Day06

news2024/12/25 23:47:40

矩阵相关题型

Leetcode 48. 旋转图像【中等】

题意理解:

        将一个矩阵顺时针旋转90度,返回旋转后的矩阵。        

        要求: 在原地修改,不借助额外的空间

        如果可以使用辅助数组来实现转置,则有

        matrix_new[i][j]=matrix[j][row-i-1];

解题思路:

       (1) 四数循环:

        将其一层一层的进行转置

        首先看最外面的一层,将其分为红色方框中的四部分

        从第一个红色方框开始: 第一个位置(0,0)将转置到(0,2)的位置上

        原本(0,2)的位置上的数转置到(2,2),

        原来(2,2)上的数转置到(2,0)

        原来(2,0)的位置转置到(0,0)

        即: (0,0)->(0,2)->(2,2)->(2,0)->(0,2)->(0,0)

        坐标变化为: (i,j)->(j,row-i-1) 变换四次

        完成一个红色框的所有元素的变换,则完成了一层数据的转置

        如何进入下一层呢?

        i++,j++即可,重复上述操作。

        何时跳出循环:

        当且仅当,i,j指向中心元素时,跳出循环,如下图中: i=3/2=1 时,走到矩阵核心,不需要继续转置

      

        

        能不能理解更简单一些呢?

        对于四数循环的while可以从循环中展开:即实现四数互换

        

        思路二:反转替代转置

       顺时针转置90度=水平+对角线

        水平翻转: new_i,new_j=row-i-1,j

        对角线反转: new_i,new_j=j,i

1.解题【四数循环】

class Solution {
    public void rotate(int[][] matrix) {
        //使用坐标变换的逻辑,实现旋转
        int row=matrix.length,col=matrix[0].length;
        int cur_i=0,cur_j=0;
        int curVal=matrix[cur_i][cur_j];
        while(cur_i!=row/2){
            for(int j=cur_i;j<row-cur_i-1;j++){
                cur_j=j;
                curVal=matrix[cur_i][cur_j];
                int count=4;
                while(count-->0){
                    int next_i=cur_j;
                    int next_j=row-cur_i-1;
                    int nextVal=matrix[next_i][next_j];
                    matrix[next_i][next_j]=curVal;
                    
                    cur_i=next_i;
                    cur_j=next_j;
                    curVal=nextVal;
                }
            }
            cur_i++;
        }
    }
}

改进:可以将四数循环的while展开写:

class Solution {
    public void rotate(int[][] matrix) {
        //使用坐标变换的逻辑,实现旋转
        int row=matrix.length,col=matrix[0].length;
        int cur_i=0;
        while(cur_i!=row/2){
            for(int cur_j=cur_i;cur_j<row-cur_i-1;cur_j++){
                int temp=matrix[cur_i][cur_j];
                matrix[cur_i][cur_j]=matrix[row-cur_j-1][cur_i];
                matrix[row-cur_j-1][cur_i]=matrix[row-cur_i-1][row-cur_j-1];
                matrix[row-cur_i-1][row-cur_j-1]=matrix[cur_j][row-cur_i-1];
                matrix[cur_j][row-cur_i-1]=temp;
                System.out.println( matrix[cur_i][cur_j]+" "+matrix[row-cur_i-1][cur_j]+" "+matrix[row-cur_i-1][row-cur_j-1]+" "+matrix[cur_i][row-cur_j-1]);
            }
            cur_i++;
        }
    }
}

1.翻转替代转置【水平翻转+对角线翻转】

class Solution {
    public void rotate(int[][] matrix) {
        //使用坐标变换的逻辑,实现旋转
        int row=matrix.length,col=matrix[0].length;
        //水平翻转
        for(int i=0;i<row/2;i++){
            for(int j=0;j<col;j++){
                int temp=matrix[i][j];
                matrix[i][j]=matrix[row-i-1][j];
                matrix[row-i-1][j]=temp;
            }
        }
        //对角线翻转
        for(int i=0;i<row;i++){
            for(int j=0;j<i;j++){
                int temp=matrix[i][j];
                matrix[i][j]=matrix[j][i];
                matrix[j][i]=temp;
            }
        }
        
    }
}

2.复杂度分析

时间复杂度:O(n^2) while(n/2)+for循环+4次while循环的时间损耗

空间复杂度:O(1)  原地转置的空间损耗

Leetcode 240. 搜索二维矩阵 II【中等】

题意理解:

        这个矩阵是有顺序的,左到右升序,上到下升序

        要求找到执行的元素,找到为true,否则为false

解题思路:

       1.逐个对比:双for循环

       2.由于每行都是升序,可以对于每行进行二分排序

       3.对角线查找:每行都是顺序升序的,每列也是升序的

                从右上角到左下角,比当前值大往左,比当前值小往下

                上下维度控制变大,左右维度控制变小

1.解题【双for循环】

class Solution {
    public boolean searchMatrix(int[][] matrix, int target) {
        int row=matrix.length,col=matrix[0].length;
        for(int i=0;i<row;i++){
            for(int j=0;j<col;j++){
                if(matrix[i][j]==target) return true;
            }
        }
        return false;
    }
}

1.解题:【遍历行二分查】

class Solution {
    public boolean searchMatrix(int[][] matrix, int target) {
        int row=matrix.length,col=matrix[0].length;
        for(int i=0;i<row;i++){
            //对每行进行二分查找
            int low=0,high=col-1;
            while(low<=high){
                int mid=(high-low)/2+low;
                int midNum=matrix[i][mid];
                if(midNum==target) return true;
                else if(midNum>target){
                    high=mid-1;
                }else{
                    low=mid+1;
                }
            }
        }
        return false;
    }
}

1.解题:【对角线查找】

class Solution {
    public boolean searchMatrix(int[][] matrix, int target) {
        int row=matrix.length,col=matrix[0].length;
        int i=0,j=col-1;
        //从右上角往左下角找,==返回>往左,<往下
        while(x<row&&y>=0){
            if(matrix[i][j]==target){
                return true;
            }else if(matrix[i][j]>target){
                j--;
            }else if(matrix[i][j]<target){
                i++;
            }
        }
        return false;
    }
}

2.复杂度分析

思路一:

时间复杂度:O(n^2) 双for的时间损耗

空间复杂度:O(1) 变量的空间损耗

思路二:

时间复杂度:O(nlogn) for+二分的时间损耗

空间复杂度:O(1) 变量的空间损耗

思路一:

时间复杂度:O(n) 双for的时间损耗

空间复杂度:O(1) 变量的空间损耗

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

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

相关文章

【图片格式转换】ICO、JPG、JPEG、PNG图片格式在线免费转换

ICO、JPG、JPEG、PNG图片格式转换 图片格式转换 https://orcc.online/image 支持ICO、JPG、JPEG、PNG等 主页 https://www.orcc.online 其他工具 pdf在线免费转word文档 https://orcc.online/pdf 时间戳转换 https://orcc.online/timestamp Base64 编码解码 https://orcc…

书生·浦语大模型开源体系(四)作业

&#x1f497;&#x1f497;&#x1f497;欢迎来到我的博客&#xff0c;你将找到有关如何使用技术解决问题的文章&#xff0c;也会找到某个技术的学习路线。无论你是何种职业&#xff0c;我都希望我的博客对你有所帮助。最后不要忘记订阅我的博客以获取最新文章&#xff0c;也欢…

流水线运行出错排查难?AI 来帮你

“我的企业有几千条流水线&#xff0c;每次流水线运行出错&#xff0c;都要投入不少的技术人员进去排查&#xff0c;需要花费不少的时间。” 遇到这种情况&#xff0c;怎么解决。在 AI 爆火的今天&#xff0c;AI 如何助力 DevOps 效率提升&#xff1f; 云效与阿里云通义大模型…

MPLS LDP浅析及应用场景举例

一、概念 华为ldp是mpls动态的标签分发、存储、控制协议&#xff0c;工作时在2.5层; 默认为只为32位主机路由且存在于路由表中的地址分标签 名词&#xff1a; MPLS domain LSR&#xff1a;Label Switching Router LER&#xff1a;Label Edge Router LSP&#xff1a;Label Swi…

RK3568 学习笔记 : u-boot 千兆网络无法 ping 通PC问题的解决

前言 开发板型号&#xff1a; 【正点原子】 的 RK3568 开发板 使用 虚拟机 ubuntu 20.04 收到单独 编译 RK3568 u-boot 【问题】u-boot 千兆网络无法ping 通&#xff1f;Linux 下千兆网络正常&#xff0c;说明&#xff1a;开发板硬件正常 u-boot 下网络如果通了&#xff0c;…

vr太阳光参数怎么设置,vr快速渲染方法

VR场景中实现逼真的光照效果&#xff0c;太阳光参数的设置尤为关键。真实的太阳光可提升效果图的质感&#xff0c;论VR太阳光参数的设置技巧&#xff0c;包括光源类型选择、光照强度调整、阴影效果优化等多个方面&#xff0c;喜爱一起来看看vr太阳光真实感设置参数吧。 vr太阳光…

Unity 新版输入系统(Input System)

前言 官方教程 注意 新的输入系统需要 Unity 2019.4 和 .NET 4 运行时。它不适用于 .NET 3.5 的项目。 教程版本&#xff1a;Unity 2021.3.26 1. 安装 1.1 打开 Package Manager 导航栏 -> Window -> Package Manager 1.2 安装 Input System 选择 Unity Registry 在列…

【电控实物-infantry】

云台电机参数 电机内部参数 相电阻:Rs1.8欧 相电感:Ls5.7810^-3H 转矩常数:Kt 0.741 NM/A 转动惯量:J KG-m^2 电机接收数据&#xff1a;-16384到16384&#xff08;-3A到3A&#xff09; 电机反馈&#xff1a;速度RPM rad/s &#xff08;2πrpm&#xff09;/60 C板陀螺仪&…

RTT学习 cortex-m移植

Cortex-M移植 PRIMASK寄存器 PRIMASK寄存器为1位宽的中断屏蔽寄存器。在置位时&#xff0c;它会阻止不可屏蔽中断&#xff08;NMI&#xff09;和HardFault异常之外的所有异常&#xff08;包括中断&#xff09;。实际上&#xff0c;它是将当前异常优先级提升为0&#xff0c;这也…

压力测试caliper/java-sdk

通过Caliper进行压力测试程序 第一步. 配置基本环境 部署 Caliper 的计算机需要有外网权限&#xff1b; 操作系统版本需要满足以下要求&#xff1a; Ubuntu > 16.04 、 CentOS > 7 或 MacOS > 10.14 &#xff1b; 部署 Caliper 的计算机需要安装有以下软件&#x…

【机器学习】科学库使用第5篇:Matplotlib,学习目标【附代码文档】

机器学习&#xff08;科学计算库&#xff09;完整教程&#xff08;附代码资料&#xff09;主要内容讲述&#xff1a;机器学习&#xff08;常用科学计算库的使用&#xff09;基础定位、目标&#xff0c;机器学习概述定位,目标,学习目标,学习目标,1 人工智能应用场景,2 人工智能小…

Nuxt3项目如何通过开启ssr让网页实现seo自由!

nuxt.config开启ssr # nuxt.config.tsexport default defineNuxtConfig({// 是否开启SSRssr: true }) 终端运行 npm run generate generate 预渲染应用程序的每个路由&#xff0c;并将结果存储为纯HTML文件。 "scripts": {"generate": "nuxt genera…

软件兼容性定义以及作用简单讲解-行云管家

设想一下&#xff0c;假如您购买了一款新软件&#xff0c;但发现它无法在您的操作系统上正常运行&#xff0c;这个时候是不是非常恼火&#xff0c;是不是非常生气。所以企业采购新软件之前&#xff0c;一定要保障与其他操作系统能兼容。今天我们就来聊聊什么是软件兼容性&#…

小程序AI智能名片S2B2C商城系统:五大营销技术模块深度剖析

在当今数字化营销的时代&#xff0c;小程序AI智能名片S2B2C商城系统凭借五大核心营销技术模块&#xff0c;为企业提供了强大的私域流量管理与营销能力。下面我们将逐一剖析这五大模块&#xff0c;看它们如何共同助力企业实现精准营销与业务增长。 一、小程序&#xff1a;用户触…

1、Flink DataStreamAPI 概述(上)

一、DataStream API 1、概述 1&#xff09;Flink程序剖析 1.Flink程序组成 a&#xff09;Flink程序基本组成 获取一个执行环境&#xff08;execution environment&#xff09;&#xff1b;加载/创建初始数据&#xff1b;指定数据相关的转换&#xff1b;指定计算结果的存储…

Nintex访问上海斯歌总部,双方达成重要战略共识

近日&#xff0c;Nintex公司&#xff08;K2产品总部&#xff09;亚太区域销售副总裁Keith Payne、资深解决方案工程师Ranjit Nair以及区域销售经理Rachel一行莅临上海斯歌总部进行访问。在此次会晤中&#xff0c;上海斯歌与Nintex就未来在中国大陆及中国香港市场的战略发展达成…

SOLIDWORKS 2024 MBD新增功能

MBD即基于模型的工程定义、是一个用集成的三维实体模型来完整表达产品定义信息的方法体&#xff0c;它详细规定了三维实体模型中产品尺寸、公差的标注规则和工艺信息的表达方法。 01 通过实体几何体控制注解的可见性 SOLIDWORKS 2024 MBD 在用户使用体验上做了很大的提升。S…

QT初识

通过图形化界面输出helloworld 既然学习了QT&#xff0c;那么自然要做经典的输出helloworld字符串的实验。 QT有两好几种方案输出helloworld&#xff0c;一种是通过图形化界面输出&#xff0c;一种是通过代码实现。 这里先了解图形化界面的方案。 创建项目后&#xff0c;点…

高频前端面试题汇总之HTML篇

1. src和href的区别 src和href都是用来引用外部的资源&#xff0c;它们的区别如下&#xff1a; src&#xff1a; 表示对资源的引用&#xff0c;它指向的内容会嵌入到当前标签所在的位置。src会将其指向的资源下载并应⽤到⽂档内&#xff0c;如请求js脚本。当浏览器解析到该元素…