leetcode 48.旋转图像 54.螺旋矩阵 59.螺旋矩阵||

本文深入探讨了图像旋转及螺旋矩阵打印与生成的算法原理,通过实例详细讲解了如何在原地旋转图像,以及如何按照顺时针螺旋顺序遍历和生成矩阵,提供了清晰的代码实现。

48.旋转图像

给定一个 n × n 的二维矩阵表示一个图像。
将图像顺时针旋转 90 度。
说明:
你必须在原地旋转图像,这意味着你需要直接修改输入的二维矩阵。请不要使用另一个矩阵来旋转图像。

给定 matrix = 
[
[1,2,3],
[4,5,6],
[7,8,9]
],	
原地旋转输入矩阵,使其变为:
[
  [7,4,1],
  [8,5,2],
 [9,6,3]
]

这个题目在左神的算法课里有讲过。
思想:宏观的考虑数据的变动。给定矩阵,考虑一层一层变换。对于一层,给定左上角点和右下角点,对于一个点,就会有相应的四个点,数字进行交换。 如果陷入坐标变换,就会十分麻烦。
在这里插入图片描述
问题延伸:转圈打印矩阵,之字形打印矩阵。(不拘泥于坐标,而是考虑整体、宏观的变换。
延伸问题阅读

class Solution {
public:
    void rotate(vector<vector<int>>& matrix) {
        int len = matrix[0].size();
        for(int i=0; i<len;i++){
            pt(matrix,i,len-1-i);
        }
    }

    void pt(vector<vector<int>>& matrix, int posup, int posdown){
        int temp; 
        for(int i =0; i<posdown-posup;i++){
            temp =matrix[posup][posup+i];
            matrix[posup][posup+i] = matrix[posdown-i][posup] ;
            matrix[posdown-i][posup] =matrix[posdown][posdown-i];
            matrix[posdown][posdown-i] = matrix[posup+i][posdown];
            matrix[posup+i][posdown] = temp;         
        }
    }
};

54.螺旋矩阵

给定一个包含 m x n 个元素的矩阵(m 行, n 列),请按照顺时针螺旋顺序,返回矩阵中的所有元素。

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

思路: 也是要总结宏观的规律,给定左上角和右下角点,顺序输出一圈的元素。注意最中心只有一行或者一列要特殊讨论
在这里插入图片描述
代码

class Solution {
public:
    vector<int> spiralOrder(vector<vector<int>>& matrix) {
        vector<int> sb;
        if(matrix.size()==0) return sb;
        int i=0;
        int x=matrix.size()-1;
        int y=matrix[0].size()-1;
        while(i<=x && i<=y){
            pt(matrix,i,i,x,y,sb);
            i++;
            x--;
            y--;
        }
        return sb;
    }

    void pt(vector<vector<int>>& matrix, int leftx,int lefty, int rightx, int righty,vector<int>& sb){        
        int i=leftx;
        int j=lefty;
        if (leftx==rightx && lefty ==righty) {
            sb.push_back(matrix[leftx][leftx]);
            return;}
        if(leftx==rightx){
            while(j<=righty){
                sb.push_back(matrix[leftx][j]);
                j++;                
            }
            return;
        }
        if(righty==lefty){
            while(i<=rightx){
                sb.push_back(matrix[i][lefty]);
                i++;
                
            }
            return;
        }
        while(j<righty){
            sb.push_back(matrix[i][j]);
            j++;
        }
        while(i<rightx){
            sb.push_back(matrix[i][j]);
            i++;
        } 
        while(j>lefty ){
            sb.push_back(matrix[i][j]);
            j--;
        }
        while(i>leftx){
            sb.push_back(matrix[i][j]);
            i--;
        }
    }
};

59.螺旋矩阵ll

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

示例:

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

思路:同样是要宏观地表达。给定左上角点和右下角点,可以确定一圈的数字。 定义一个函数用来填数字,并且返回填入的数字,让下一圈继续这个数字填。
注意: vector矩阵在初始化的时候要确定大小。vector<vector> sb(n,vector(n,0));

class Solution {
public:
    vector<vector<int>> generateMatrix(int n) {
        int num=1;
        int i=0;
        int j=n-1;
        vector<vector<int>> sb(n,vector<int>(n));
        while(i<=j){
            num = pr(sb,i++,j--,num);
        }
        return sb;
    }

    int pr(vector<vector<int>> &sb,int left,int right,int num){
        if(left==right){
            sb[left][left]=num++;
            return num;
        }
        int i=left;
        int j=left;
        while(i<right){
            sb[j][i++] = num++;
        }
        while(j<right){
            sb[j++][i] = num++;
        }
        while(i>left){
            sb[j][i--]=num++;
        }
        while(j>left){
            sb[j--][i]=num++;
        }
        return num;
    }
};
本课题设计了一种利用Matlab平台开发的植物叶片健康状态识别方案,重点融合了色彩与纹理双重特征以实现对叶片病害的自动化判别。该系统构建了直观的图形操作界面,便于用户提交叶片影像并快速获得分析结论。Matlab作为具备高效数值计算与数据处理能力的工具,在图像分析与模式分类领域应用广泛,本项目正是借助其功能解决农业病害监测的实际问题。 在色彩特征分析方面,叶片影像的颜色分布常与其生理状态密切相关。通常,健康的叶片呈现绿色,而出现黄化、褐变等异常色彩往往指示病害或虫害的发生。Matlab提供了一系列图像处理函数,例如可通过色彩空间转换与直方图统计来量化颜色属性。通过计算各颜色通道的统计参数(如均值、标准差及主成分等),能够提取具有判别力的色彩特征,从而为不同病害类别的区分提供依据。 纹理特征则用于描述叶片表面的微观结构与形态变化,如病斑、皱缩或裂纹等。Matlab中的灰度共生矩阵计算函数可用于提取对比度、均匀性、相关性等纹理指标。此外,局部二值模式与Gabor滤波等方法也能从多尺度刻画纹理细节,进一步增强病害识别的鲁棒性。 系统的人机交互界面基于Matlab的图形用户界面开发环境实现。用户可通过该界面上传待检图像,系统将自动执行图像预处理、特征抽取与分类判断。采用的分类模型包括支持向量机、决策树等机器学习方法,通过对已标注样本的训练,模型能够依据新图像的特征向量预测其所属的病害类别。 此类课题设计有助于深化对Matlab编程、图像处理技术与模式识别原理的理解。通过完整实现从特征提取到分类决策的流程,学生能够将理论知识与实际应用相结合,提升解决复杂工程问题的能力。总体而言,该叶片病害检测系统涵盖了图像分析、特征融合、分类算法及界面开发等多个技术环节,为学习与掌握基于Matlab的智能检测技术提供了综合性实践案例。 资源来源于网络分享,仅用于学习交流使用,请勿用于商业,如有侵权请联系我删除!
这是一个非常经典的二维数组操作题,**LeetCode48 题:旋转图像(Rotate Image)**,题目要求你**将一个 n × n 的二维矩阵顺时针旋转 90 度**,并且要求**原地修改(in-place)**,不能使用额外的二维数组。 --- ## 📌 题目要求(LeetCode 48. Rotate Image) > 给定一个 n × n 的二维矩阵表示一个图像,将该矩阵**顺时针旋转 90 度**。 > 要求:必须在**原地修改矩阵**,即不能返回新的矩阵。 --- ## ✅ 解题思路: **顺时针旋转 90 度的规律是:** > 对于矩阵中的任意一个位置 `(i, j)`,旋转后的位置变为 `(j, n - 1 - i)`。 > 但直接替换会覆盖数据,所以我们可以使用一种**更巧妙的方法**。 ### ✅ 推荐方法:**先转置矩阵,再每行翻转** - **转置矩阵**:行变列,列变行(即交换 matrix[i][j] 和 matrix[j][i]) - **每行翻转**:每行元素反转,即可实现顺时针旋转 90 度 --- ## ✅ Python 实现代码如下: ```python def rotate(matrix): n = len(matrix) # Step 1: 转置矩阵(行变列) for i in range(n): for j in range(i + 1, n): matrix[i][j], matrix[j][i] = matrix[j][i], matrix[i][j] # Step 2: 每行翻转 for row in matrix: row.reverse() ``` --- ## ✅ 示例: 输入: ```python matrix = [ [1, 2, 3], [4, 5, 6], [7, 8, 9] ] ``` 调用 `rotate(matrix)` 后,输出变为: ```python [ [7, 4, 1], [8, 5, 2], [9, 6, 3] ] ``` --- ## ✅ 时间复杂度分析: - 时间复杂度:O(n²),因为每个元素都要访问一次 - 空间复杂度:O(1),原地修改,没有使用额外空间 --- ## ✅ 总结一句话: 顺时针旋转 90 度 = **先转置矩阵,再每行反转**,这是最简洁且高效的解法。 --- ## ❓
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值