当前位置: 首页 > article >正文

力扣第48题“旋转图像”

题目描述

给定一个 n × n 的二维矩阵 matrix,将其原地顺时针旋转 90 度。

示例:

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

解题思路

要将矩阵顺时针旋转 90 度,可以分为以下两个步骤:

  1. 矩阵转置:将矩阵的行列互换,使 matrix[i][j]matrix[j][i] 交换。
  2. 水平翻转每一行:对于每一行,将左右两边的元素交换,使得第 i 行的第 j 个元素和第 n-1-j 个元素交换。

通过以上步骤,原矩阵将被顺时针旋转 90 度。

代码实现

以下是 C 语言实现和逐行解释。

#include <stdio.h>

void rotate(int** matrix, int matrixSize, int* matrixColSize) {
    // 1. 转置矩阵
    for (int i = 0; i < matrixSize; i++) {
        for (int j = i + 1; j < matrixSize; j++) {
            int temp = matrix[i][j];
            matrix[i][j] = matrix[j][i];
            matrix[j][i] = temp;
        }
    }
    
    // 2. 水平翻转每一行
    for (int i = 0; i < matrixSize; i++) {
        for (int j = 0; j < matrixSize / 2; j++) {
            int temp = matrix[i][j];
            matrix[i][j] = matrix[i][matrixSize - 1 - j];
            matrix[i][matrixSize - 1 - j] = temp;
        }
    }
}

// 测试代码
int main() {
    int n = 3;
    int* matrix[] = {
        (int[]){1, 2, 3},
        (int[]){4, 5, 6},
        (int[]){7, 8, 9}
    };

    rotate(matrix, n, NULL);

    printf("旋转后的矩阵:\n");
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < n; j++) {
            printf("%d ", matrix[i][j]);
        }
        printf("\n");
    }

    return 0;
}

代码解析

  1. 矩阵转置

    for (int i = 0; i < matrixSize; i++) {
        for (int j = i + 1; j < matrixSize; j++) {
            int temp = matrix[i][j];
            matrix[i][j] = matrix[j][i];
            matrix[j][i] = temp;
        }
    }
    
    • 通过嵌套循环,交换 matrix[i][j]matrix[j][i],将矩阵进行转置。
  2. 水平翻转每一行

    for (int i = 0; i < matrixSize; i++) {
        for (int j = 0; j < matrixSize / 2; j++) {
            int temp = matrix[i][j];
            matrix[i][j] = matrix[i][matrixSize - 1 - j];
            matrix[i][matrixSize - 1 - j] = temp;
        }
    }
    
    • 遍历每一行,将两端的元素交换,从而实现行的水平翻转。
  3. 测试代码

    • 初始化一个 3 × 3 的矩阵,并调用 rotate 函数进行旋转。
    • 输出旋转后的矩阵,验证结果是否正确。

复杂度分析

  • 时间复杂度O(n^2),其中 n 是矩阵的边长。转置和水平翻转各需 O(n^2) 的时间。
  • 空间复杂度O(1),在原地修改矩阵,不需要额外空间。

http://www.kler.cn/a/394820.html

相关文章:

  • 【数据价值化】国有企业数据资产入表及估值实践指南:挖掘数字资产新价值
  • 【汇编语言】包含多个段的程序(二)—— 将数据、代码、栈放入不同的段
  • FluentUI使用
  • git没有识别出大写字母改成小写重命名的文件目录
  • Vue3.js - 一文看懂Vuex
  • Gartner发布安全平台创新洞察:安全平台需具备的11项常见服务
  • 计算机网络-2.1物理层
  • C++全局构造和初始化
  • 算法训练(leetcode)二刷第二十五天 | *134. 加油站、*135. 分发糖果、860. 柠檬水找零、*406. 根据身高重建队列
  • 24/11/14 算法笔记 EM算法期望最大化算法
  • CentOS网络配置
  • 利用飞书多维表格自动发布版本
  • Matlab实现麻雀优化算法优化随机森林算法模型 (SSA-RF)(附源码)
  • 【Android、IOS、Flutter、鸿蒙、ReactNative 】标题栏
  • Isaac Sim+SKRL机器人并行强化学习
  • 【Android、IOS、Flutter、鸿蒙、ReactNative 】文本点击事件
  • 【CICD】GitLab Runner 和执行器(Executor
  • 通过PHP创建AWS的CloudFront并绑定证书添加备用域名
  • sql server创建固定的链路服务器
  • kafka:使用flume自定义拦截器,将json文件抽取到kafka的消息队列(topic)中,再从topic中将数据抽取到hdfs上
  • 麒麟服务器工作站SP1 arm环境qt5.6.3源码编译
  • 如何处理 iOS 客户端内 Webview H5 中后台播放的音视频问题
  • Mac 使用mac 原生工具将mp4视频文件提取其中的 mp3 音频文件
  • git config是做什么的?
  • 如何在 Ubuntu 22.04 上安装 ownCloud
  • 数字IC后端实现之Innovus specifyCellEdgeSpacing和ICC2 set_placement_spacing_rule的应用