• 【LeetCode】螺旋矩阵&&旋转图像


    ​🌠 作者:@阿亮joy.
    🎆专栏:《阿亮爱刷题》
    🎇 座右铭:每个优秀的人都有一段沉默的时光,那段时光是付出了很多努力却得不到结果的日子,我们把它叫做扎根
    在这里插入图片描述

    👉螺旋矩阵👈

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

    示例 1:

    在这里插入图片描述
    输入:matrix = [[1,2,3],[4,5,6],[7,8,9]]
    输出:[1,2,3,6,9,8,7,4,5]

    示例 2:

    在这里插入图片描述
    输入:matrix = [[1,2,3,4],[5,6,7,8],[9,10,11,12]]
    输出:[1,2,3,4,8,12,11,10,9,5,6,7]

    提示:

    • m == matrix.length
    • n == matrix[i].length
    • 1 <= m, n <= 10
    • -100 <= matrix[i][j] <= 100

    思路:先分别定义上下左右边界curbelowleftright,当上边界大于下边界或者左边界大于右边界时,退出while循环。循环开始,首先,利用for循环向右遍历矩阵,依次将矩阵的元素加入到返回的数组中。第一个for循环结束,cur++,调整上边界并判断是否大于下边界。如果大于下边界就退出while循环,否则向下遍历矩阵。遍历的方式以及while循环的条件类似,在此就不赘述了。

    int* spiralOrder(int** matrix, int matrixSize, int* matrixColSize, int* returnSize)
    {
        *returnSize = matrixSize * (*matrixColSize);//返回数组元素的个数
        int* ret = (int*)malloc(sizeof(int)*(*returnSize));
        int n = 0;//数组下标
        int cur = 0;//上边界
        int below = matrixSize - 1;//下边界
        int left = 0;//左边界
        int right = *matrixColSize - 1;//右边界
        int i = 0;
        while(1)
        {
            //向右遍历一行
            for(i = left; i <= right; i++)
            {
                ret[n++] = matrix[cur][i];
            }
            //调整上边界,若上边界大于下边界,则遍历矩阵完成
            cur++;
            if(cur > below) 
                break;
            //向下遍历一列
            for(i = cur; i <= below; i++)
            {
                ret[n++] = matrix[i][right];
            }
            //调整右边界,左边界大于右边界,则遍历矩阵完成
            right--;
            if(left > right)
                break;
            //向左遍历一行
            for(i = right; i >= left; i--)
            {
                ret[n++] = matrix[below][i];
            }
            //调整下边界,若上边界大于下边界,则遍历矩阵完成
            below--;
            if(cur > below)
                break;
            //向上遍历一列
            for(i = below; i >= cur; i--)
            {
                ret[n++] = matrix[i][left];
            }
            //调整左边界,左边界大于右边界,则遍历矩阵完成
            left++;
            if(left > right)
                break;
        }
        return ret;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51

    在这里插入图片描述

    👉螺旋矩阵II👈

    给你一个正整数 n ,生成一个包含 1 到 n^2 所有元素,且元素按顺时针顺序螺旋排列的 n x n 正方形矩阵 matrix 。


    示例 1:

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

    示例 2:

    输入:n = 1
    输出:[[1]]

    提示:

    1 <= n <= 20

    思路:我们可以借助螺旋矩阵的遍历的方式,依次给矩阵赋值。

    int** generateMatrix(int n, int* returnSize, int** returnColumnSizes)
    {
        *returnSize = n;//函数
        *returnColumnSizes = (int*)malloc(sizeof(int)*n);//列数组
        int** ret = (int**)malloc(sizeof(int*)*n);
        int i = 0;
        for(i = 0; i < n; i++)
        {
            ret[i] = (int*)calloc(n, sizeof(int));//将矩阵中的元素初始化为0
            (*returnColumnSizes)[i] = n;//每一列元素的个数
        }
    
        int cur = 0;//上边界
        int left = 0;//左边界
        int right = n - 1;//右边界
        int below = n - 1;//下边界
        int count = 1;//元素
        while(1)
        {
            //向右遍历给矩阵赋值
            for(i = left; i <= right; i++)
            {
                ret[cur][i] = count;
                count++;
            }
            //调整上边界
            cur++;
            //判断上边界是否大于下边界,如果大于,赋值完成,退出循环
            if(cur > below)
                break;
            //向下遍历给矩阵赋值
            for(i = cur; i <= below; i++)
            {
                ret[i][right] = count;
                count++;
            }
            //调整右边界
            right--;
            //判断左边界是否大于右边界,如果大于,赋值完成,退出循环
            if(left > right)
                break;
            //向左遍历给矩阵赋值
            for(i = right; i >= left; i--)
            {
                ret[below][i] = count;
                count++;
            }
            //调整下边界
            below--;
            //判断上边界是否大于下边界,如果大于,赋值完成,退出循环
            if(cur > below)
                break;
            //向上遍历给矩阵赋值
            for(i = below; i >= cur; i--)
            {
                ret[i][left] = count;
                count++;
            }
            //调整左边界
            left++;
            //判断左边界是否大于右边界,如果大于,赋值完成,退出循环
            if(left > right)
                break;
        }
        return ret;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66

    在这里插入图片描述

    👉旋转图像👈

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

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

    示例 1:

    在这里插入图片描述
    输入:matrix = [[1,2,3],[4,5,6],[7,8,9]]
    输出:[[7,4,1],[8,5,2],[9,6,3]]

    示例2:

    在这里插入图片描述
    输入:matrix = [[5,1,9,11],[2,4,8,10],[13,3,6,7],[15,14,12,16]]
    输出:[[15,13,2,5],[14,3,4,1],[12,6,8,9],[16,7,10,11]]

    提示:

    • n == matrix.length == matrix[i].length
    • 1 <= n <= 20
    • -1000 <= matrix[i][j] <= 1000

    思路:先将矩阵中的元素上下对称交换,然后矩阵中的元素再关于对角线交换,就能达到将图像顺时针旋转 90 度的效果了。
    在这里插入图片描述

    //交换元素的值
    void swap(int* a, int* b)
    {
        int tmp = *a;
        *a = *b;
        *b = tmp;
    }
    
    void rotate(int** matrix, int matrixSize, int* matrixColSize)
    {
        int i = 0;
        int j = 0;
        //上下交换
        for(i = 0; i < matrixSize / 2; i++)
        {
            for(j = 0; j < *matrixColSize; j++)
            {
                swap(&matrix[i][j], &matrix[matrixSize - 1 - i][j]);
            }
        }
        //对角线交换
        for(i = 0; i < matrixSize; i++)
        {
            for(j = 0; j < i; j++)
            {
                swap(&matrix[i][j], &matrix[j][i]);
            }
        }
        
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30

    在这里插入图片描述

    👉总结👈

    本篇文章主要讲解了挺经典的矩阵题目,尤其是旋转矩阵,对循环的把控需要掌握得很到位,才可能解得出来。可能这两道题目还有更加简便的解法,现在还未掌握,以后会加以补充。如果大家觉得有收获的话,可以点个三连支持一下!谢谢大家啦!💖💝❣️

  • 相关阅读:
    c++中 多线程执行时 线程的执行顺序不固定
    日防夜防,家贼难防?企业防泄密为什么这么难?
    SpringBoot+Vue+Element-UI实现人事管理系统
    03 - 雷达的基本组成
    树和二叉树
    【vuex】
    pytorch初学笔记(三)Tranforms的使用
    Magisk V26.3卡刷包APK最新版下载-支持payload.bin自动维补ROOT
    从零开始写 Docker(二)---优化:使用匿名管道传递参数
    【Android笔记46】Android中如何自定义弹出框样式
  • 原文地址:https://blog.csdn.net/m0_63639164/article/details/126757395