【Leetcode每日一刷】顺/逆时针旋转矩阵 |48. 旋转图像、矩阵的螺旋遍历 |54. 螺旋矩阵

news2025/1/13 9:38:06

一、48. 旋转图像

1.1:题目

48. 旋转图像
在这里插入图片描述

1.2:解题思路

  • 题型顺/逆时针旋转矩阵

  • ❗❗核心思想/ 关键不可暴力模拟,先镜像,后水平翻转
    这题的意思很简单,就是让我们把矩阵顺时针选择90°,但是难点在于如何原地旋转。
    在这里插入图片描述
    寻常的思路有以下两种:可能会误认为去模拟一下,一圈一圈的去遍历,然后进行旋转;又或者是想去找出当前坐标和旋转后像素对应坐标位置之间的关系,结果发现都想不出来很好的解决方法。

    这题的关键就在于不走寻常路。它用了另外一种比较巧妙的方法,对于计算机比较好理解,但对于我们可能一下子想不到的方法去解决了。(对于这种题,只要有个印象,以后遇到类似题目就不会懵圈了。
    在这里插入图片描述

1.3:实现代码——c++

class Solution {
public:
    void rotate(vector<vector<int>>& matrix) {
        //Step1:先对原矩阵逐行遍历,进行镜像
        for(int i = 0; i < matrix.size() - 1; i++){
            for (int j = i + 1; j < matrix.size(); j++){
                //对角线元素进行交换
                int temp = matrix[i][j];
                matrix[i][j] = matrix[j][i];
                matrix[j][i] = temp;
            }
        }
        //Step2: 每行进行翻转
        for (int  i = 0; i < matrix.size(); i++){
            //对这一行元素进行翻转
            for (int j = 0; j < matrix.size()/2; j++){
                int temp = matrix[i][j];
                matrix[i][j] = matrix[i][matrix.size() - j - 1];
                matrix[i][matrix.size() - j - 1] = temp;
            }
        }

    }
};

二、54. 螺旋矩阵

2.1:题目

在这里插入图片描述

1.1:解题思路

  • 题型矩阵的螺旋遍历
  • ❗❗核心思想/ 关键模拟,用四个边界点去控制遍历的边界!
    这题最开始我的思路是先求出遍历几圈(一个圈数的大循环),然后根据边界和当前遍历圈数的关系再去一圈一圈的模拟遍历,发现真正这种纯模拟的方法,很不好把握边界,也很容易少加或者多加元素。
    其实这题最好的思路如下图,设置四个边界标记变量,每一次循环完一圈后,更新一下四个边界。外面的大循环是结果数组的元素个数控制着(这样就不会多加或少加元素!)
    在这里插入图片描述
    随着数组遍历,边界更新(收缩)
    在这里插入图片描述
  • 注意,在遍历完一条边后,边界点也要随之更新!!!

1.3:实现代码——c++

// 注意:cpp 代码由 chatGPT🤖 根据我的 java 代码翻译,旨在帮助不同背景的读者理解算法逻辑。
// 本代码不保证正确性,仅供参考。如有疑惑,可以参照我写的 java 代码对比查看。

#include <vector>
#include <deque>

using namespace std;

vector<int> spiralOrder(vector<vector<int>>& matrix) {
    int m = matrix.size(), n = matrix[0].size();
    int upper_bound = 0, lower_bound = m - 1;
    int left_bound = 0, right_bound = n - 1;
    vector<int> res;
    // res.size() == m * n 则遍历完整个数组
    while (res.size() < m * n) {
        if (upper_bound <= lower_bound) {
            // 在顶部从左向右遍历
            for (int j = left_bound; j <= right_bound; j++) {
                res.push_back(matrix[upper_bound][j]);
            }
            // 上边界下移
            upper_bound++;
        }
        
        if (left_bound <= right_bound) {
            // 在右侧从上向下遍历
            for (int i = upper_bound; i <= lower_bound; i++) {
                res.push_back(matrix[i][right_bound]);
            }
            // 右边界左移
            right_bound--;
        }
        
        if (upper_bound <= lower_bound) {
            // 在底部从右向左遍历
            for (int j = right_bound; j >= left_bound; j--) {
                res.push_back(matrix[lower_bound][j]);
            }
            // 下边界上移
            lower_bound--;
        }
        
        if (left_bound <= right_bound) {
            // 在左侧从下向上遍历
            for (int i = lower_bound; i >= upper_bound; i--) {
                res.push_back(matrix[i][left_bound]);
            }
            // 左边界右移
            left_bound++;
        }
    }
    return res;
}

1.4:总结&易错点

  • 在这题注意,四个边界点每遍历完一边就必须更新,因为边界点控制的遍历边界条件是左闭右闭!
  • 每次遍历一条边之前,先判断一下是否满足遍历条件!!!(易错),否则容易重复遍历元素!!!

像下图这样,如果没有在遍历没条边之前进行if可行性判断,那么就会重复遍历元素!!!(在第二个循环的第三个if不能进去!!!因为遍历完上边之后,这一圈的元素都遍历完了)

为什么会出现这种情况呢?我们不是明明规定好边界了吗?因为每次在遍历一条边时,的确有边界,但是你要保证这个边界是合理的!!!如果边界合理,OK,你就可以遍历!!!但是在这题中,在边界缩小过程中,很有可能出现边界不合理的情况!!!
在这里插入图片描述

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

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

相关文章

LabVIEW电磁阀特性测控系统

LabVIEW电磁阀特性测控系统 电磁阀作为自动化工程中的重要组成部分&#xff0c;其性能直接影响系统的稳定性和可靠性。设计一种基于LabVIEW的电磁阀特性测控系统&#xff0c;通过高精度数据采集和智能化控制技术&#xff0c;实现电磁阀流阻、响应时间及脉冲特性的准确测量和分…

吴恩达深度学习笔记:神经网络的编程基础2.9-2.14

目录 第一门课&#xff1a;神经网络和深度学习 (Neural Networks and Deep Learning)第二周&#xff1a;神经网络的编程基础 (Basics of Neural Network programming)2.9 逻辑回归中的梯度下降&#xff08;Logistic Regression Gradient Descent&#xff09; 第一门课&#xff…

vscode 向下复制当前行(即visual studio 中的Ctrl + D)功能快捷键

参考:https://blog.csdn.net/haihui1996/article/details/87937912 打开vscode左下角键盘快捷键设置&#xff0c;找到copy line down&#xff0c;即可查看当前默认快捷键为“shift Alt ↓” 双击快捷键&#xff0c;输入自己想要的快捷组合&#xff0c;如CtrlD&#xff0c;然…

Java Web程序的部署

写在前&#xff1a;要想将我们写好的项目让其他人可以访问&#xff0c;仅仅完成代码是不能直接运行的。这就需要在Linux系统上搭建Java web程序的运行环境。这里以我所做的博客系统为例&#xff0c;进行搭建。 1. 准备依赖 &#xff08;1&#xff09;JVM&#xff08;JDK&#…

windows中的出站和入站规则

一、规则介绍   规则生效的前提是防火墙处于开启状态。 windows系统默认的规则&#xff1a;默认阻止入站连接&#xff0c;默认允许出站连接。也就是说&#xff0c;凡是入站连接&#xff0c;任何程序和端口都要在防火墙上配置入站规则&#xff0c;否则都会被禁止。 查看方式&a…

非光滑非凸规划

目录 一&#xff0c;非凸函数的近端梯度下降 1&#xff0c;凸函数的近端梯度下降 2&#xff0c;非凸函数的近端梯度下降 一&#xff0c;非凸函数的近端梯度下降 1&#xff0c;凸函数的近端梯度下降 参考近端梯度下降 2&#xff0c;非凸函数的近端梯度下降

Docker/Linux Mysql 远程连接不上,user 的host为localhost

如果 alter user root% identified with mysql_native_password by 123456; 返回的是&#xff1a;Query OK, 0 rows affected (0.00 sec) 而不是&#xff1a;ERROR 1396 (HY000): Operation ALTER USER failed for root% 那么你只要在执行 flush privileges; 就可以了。 …

数字化经济的前沿:深入了解 Web3 的商业模式

随着区块链技术的迅速发展&#xff0c;Web3作为一种新型的互联网范式&#xff0c;正逐渐引起人们的关注。它不仅仅是一种技术革新&#xff0c;更是一种商业模式和价值观的转变。本文将深入探讨Web3的商业模式&#xff0c;以及它对数字化经济的影响。 1. 理解Web3的商业模式 We…

Docker 安装部署 ORACLE 11g数据库

Docker 安装部署 ORACLE 11g数据库 背景&#xff1a; ​ 最新在开发数据中台数据接入模块&#xff0c;其中设计很多数据类型&#xff0c;包括ORACLE &#xff0c;因为是测试使用&#xff0c;想着快速部署测试&#xff0c;于是使用Docker 部署 Oracle , 生产环境不建议使用Doc…

网络工程师笔记14

VLAN原理与配置 VLAN 的功能 划分广播域&#xff0c;隔离广播域 VLAN的应用划分 VLAN配置命令

在 Android 上恢复已删除文件的 5 种简单方法

您可能会因为意外删除、未完成的 Android 更新、手机意外关机等原因而丢失 Android 上的重要数据。新技术的发展使许多手机功能或程序能够从内部恢复丢失的数据。 在 Android 上恢复已删除文件的 5 种简单方法 然而恢复成功率的不确定性也成为人们克服数据丢失困境的重要考虑因…

海思3516将BT1120改BT656输出大小为720*576

sample_comm_vi.c结构体 VI_DEV_ATTR_S DEV_ATTR_BT656D1_1MUX VI_DEV_ATTR_S DEV_ATTR_BT656D1_1MUX {/* interface mode */VI_MODE_BT656,/* multiplex mode */VI_WORK_MODE_1Multiplex,/* r_mask g_mask b_mask*/{0xFF0000, 0x0},//掩码根据自己实际写/* progess…

C++ //练习 10.35 使用普通迭代器逆序打印一个vector。

C Primer&#xff08;第5版&#xff09; 练习 10.35 练习 10.35 使用普通迭代器逆序打印一个vector。 环境&#xff1a;Linux Ubuntu&#xff08;云服务器&#xff09; 工具&#xff1a;vim 代码块 /********************************************************************…

完美解决 RabbitMQ可视化界面Overview不显示折线图和队列不显示Messages

问题场景&#xff1a; 今天使用docker部署了一个RabbitMQ&#xff0c;浏览器打开15672可视化页面发送消息后不显示Overview中的折线图&#xff0c;还有队列中的Messages&#xff0c;因为我要看队列中的消息数量。 解决方案&#xff1a; 进入容器内部 docker exec -it 容器id…

自动从Android上拉取指定文件

需求场景 利用Mac中的脚本编辑器实现从连接的Android设备中获取指定的文件。 环境 macOS Monterey 版本 12.7.1脚本编辑器adb环境&#xff08;如果没有的话&#xff0c;可以网上搜下Mac配置adb&#xff09; 实现方案 1、打开脚本编辑器&#xff1b; 2、新建一个脚本文件&…

Git之版本回退

文章转载于&#xff1a;https://www.jianshu.com/p/3020740561a8 以前&#xff0c;如果是要去除某一块功能&#xff0c;我都是选择性删除&#xff0c;选择性注释&#xff0c;然后前后逻辑各种查看&#xff0c;各种比较。每一次&#xff0c;改完这些我总感觉心好累啊&#xff01…

300m的视频如何制作二维码?扫码点击播放视频的在线技巧

如何快速将几十M或者几百M的视频文件做成二维码呢&#xff1f;用二维码来展示视频是现在很流行的一种方式&#xff0c;比如产品说明、自拍录像、企业介绍、使用教程等方面的内容&#xff0c;都可以通过这种方式来完成视频内容的传递。 其实视频生成二维码的方法没有想象中的那…

【数学】【位运算】LeetCoce810. 黑板异或游戏

作者推荐 视频算法专题 本文涉及知识点 数学 位运算 LeetCoce810. 黑板异或游戏 黑板上写着一个非负整数数组 nums[i] 。 Alice 和 Bob 轮流从黑板上擦掉一个数字&#xff0c;Alice 先手。如果擦除一个数字后&#xff0c;剩余的所有数字按位异或运算得出的结果等于 0 的话…

【词云图绘制实战】——数据准备、清洗、多形式展示

文章目录 1 手动输入文本1.1 加载包1.2 分词处理1.2.1 普通分词方式1.2.2 hmm分词 1.2 词云图绘制1.2.1 wordcloud词云图1.2.2 wordcloud2词云图 2 读取文本数据2.1 读取文本数据2.2 分词处理2.3 词云图绘制2.3.1 wordcloud词云图2.3.2 wordcloud2词云图2.3.3 letterCloud词云图…

windows中如何将已安装的node.js版本进行更换

第一步&#xff1a;先清除已经安装好的node.js版本 1.按健winR弹出窗口&#xff0c;键盘输入cmd,然后敲回车&#xff08;或者鼠标直接点击电脑桌面最左下角的win窗口图标弹出&#xff0c;输入cmd再点击回车键&#xff09; 然后进入命令控制行窗口&#xff0c;并输入where node…