[解题报告]《算法零基础100讲》(第3讲) 矩阵(1)

简介: [解题报告]《算法零基础100讲》(第3讲) 矩阵(1)

☘前言☘

今天是九日集训第七天,我会记录一下学习内容和题解,争当课代表0.0.

链接:《算法零基础100讲》(第3讲) 矩阵


🧑🏻作者简介:一个从工业设计改行学嵌入式的年轻人

✨联系方式:2201891280(QQ)

⏳全文大约阅读时间: 20min


全文目录

 ☘前言☘

 🎁主要知识点梳理

            📝1.矩阵的定义

            🍭2.矩阵的水平翻转

            🍜3.矩阵的垂直翻转

            🍡4.矩阵的顺时针旋转

            🍛5.矩阵的逆时针旋转

            🍣6.矩阵的逆时针转置

 📓课后习题

             1672. 最富有客户的资产总量

             1582. 二进制矩阵中的特殊位置

             832. 翻转图像

             48. 旋转图像

             867. 转置矩阵

             2022. 将一维数组转变成二维数组

             1886. 判断矩阵经轮转后是否一致

             1260. 二维网格迁移

             54. 螺旋矩阵

 📑写在最后

🎁主要知识点梳理

📝1.矩阵的定义

矩阵Amxn 定义的是按照长方阵列排列的负数或者实数集合,其中n表示行数,m代表列数。入下图所示为一个4x3的矩阵

cb7773f4e2123927e1c6444b77d3e13.png

在c语言我们可以用二维数组A[n][m]代表一个nxm 矩阵,其中``A[i][j]代表第 i行,第j列元素。


🍭2.矩阵的水平翻转

矩阵的水平翻转就是将矩阵每一行元素逆序。

441cac781c8fa4e1efde445e914a05f.png


🍜3.矩阵的垂直翻转

矩阵的垂直翻转就是将矩阵每一列元素逆序。

529b74829aac38381c1447d8157c88e.png

🍡4.矩阵的顺时针旋转

矩阵的顺时针旋转 90度,顾名思义就是绕着垂直于屏幕方向进行90旋转。


243b48232b660b942844677dd598ee5.png

🍛5.矩阵的逆时针旋转

逆时针转90度就是顺时针转270。


🍣6.矩阵的逆时针转置

就是对矩阵的对角线进行交换操作。

6dfb6716044f3e7efd20524a773e334.png


📓课后习题

1672. 最富有客户的资产总量

1672. 最富有客户的资产总量


给你一个m x n的整数网格accounts ,其中accounts[i][j]是第 i 位客户在第 j 家银行托管的资产数量。返回最富有客户所拥有的 资产总量 。

客户的 资产总量 就是他们在各家银行托管的资产数量之和。最富有客户就是 资产总量 最大的客户。


解题思路


每行做统计就好了呗?


int maximumWealth(int** accounts, int accountsSize, int* accountsColSize){
    int maxn = 0,temp;
    for(int i = 0;i < accountsSize; ++i){
        temp = 0;
        for(int j = 0;j < *accountsColSize; ++j) temp += accounts[i][j];
        if(temp > maxn) maxn = temp;
    }
    return maxn;
}

1582. 二进制矩阵中的特殊位置

1582. 二进制矩阵中的特殊位置


给你一个大小为rows x cols 的矩阵mat,其中mat[i][j]是 0或 1,请返回 矩阵 mat 中特殊位置的数目 。

特殊位置 定义:如果mat[i][j] == 1 并且第i行和第j列中的所有其他元素均为 0(行和列的下标均 从 0 开始 ),则位置(i, j)被称为特殊位置。


解题思路


先统计列和,可以加速。


int numSpecial(int** mat, int matSize, int* matColSize){
    int ans = 0;
    int hash[*matColSize];
    for(int j = 0; j < *matColSize; ++j){
        hash[j] = 0;
        for(int i = 0;i <matSize;i++)
            if(mat[i][j] == 1)  hash[j] ++;
    }
    for(int i = 0;i < matSize; ++i){
        int temp = 0,tempi = -1;
        for(int j = 0; j < *matColSize; ++j)
            if(mat[i][j] == 1)  temp++,tempi = j;
        if(temp == 1)
            if(hash[tempi] == 1)    ans++;
    }
    return ans;
}

832. 翻转图像

832. 翻转图像


给定一个二进制矩阵 A,我们想先水平翻转图像,然后反转图像并返回结果。

水平翻转图片就是将图片的每一行都进行翻转,即逆序。例如,水平翻转[1, 1, 0] 的结果是[0, 1, 1]。

反转图片的意思是图片中的0全部被1替换, 1 全部被 0替换。例如,反转 [0, 1, 1] 的结果是[1, 0, 0]。


解题思路


按照要求先翻转在反转就好了。

int** flipAndInvertImage(int** image, int imageSize, int* imageColSize, int* returnSize, int** returnColumnSizes){
    *returnSize = imageSize;
    *returnColumnSizes = imageColSize;
    int n = imageSize,m = *imageColSize;
    //printf("%d %d",imageSize,*imageColSize);
    for (int i = 0; i < n; i++)    
        for(int j = 0; j < (m + 1) / 2; ++j){
            if(j == m/2)    image[i][j] = !image[i][j];
            else{
                image[i][j] = image[i][j] ^ image[i][m - 1 - j];
                image[i][m - 1 - j] =  image[i][j] ^ image[i][m - 1 - j];
                image[i][j] = image[i][j] ^ image[i][m - 1 - j];
                image[i][j] = !image[i][j];
                image[i][m - 1 - j] = !image[i][m - 1 - j];
            }
        }
    return image;
}


48. 旋转图像

48. 旋转图像


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

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


解题思路


所谓旋转就是先转置再水平翻转就好了。


void rotate(int** matrix, int matrixSize, int* matrixColSize){
    //转置
    for(int i = 0;i < matrixSize; ++i)
        for(int j = i + 1;j < *matrixColSize; ++j){
            matrix[i][j] = matrix[i][j] ^ matrix[j][i];
            matrix[j][i] = matrix[i][j] ^ matrix[j][i];
            matrix[i][j] = matrix[i][j] ^ matrix[j][i];
        }
    //水平翻转
    for(int i = 0;i < matrixSize; ++i)
        for(int j = 0;j < *matrixColSize /2; ++j){
            matrix[i][j] = matrix[i][j] ^ matrix[i][*matrixColSize - 1 -j];
            matrix[i][*matrixColSize - 1 -j] = matrix[i][j] ^ matrix[i][*matrixColSize - 1 -j];
            matrix[i][j] = matrix[i][j] ^ matrix[i][*matrixColSize - 1 -j];
        }
    return matrix;
}


相关文章
|
2月前
|
算法 测试技术 C++
【动态规划】【矩阵快速幂】【滚动向量】C++算法552. 学生出勤记录 II
【动态规划】【矩阵快速幂】【滚动向量】C++算法552. 学生出勤记录 II
|
2月前
|
算法 Java Serverless
第十四届蓝桥杯集训——练习解题阶段(无序阶段)-ALGO-444 算法训练 求和问题
第十四届蓝桥杯集训——练习解题阶段(无序阶段)-ALGO-444 算法训练 求和问题
37 1
|
2月前
|
算法 Java C语言
第十四届蓝桥杯集训——练习解题阶段(无序阶段)-ALGO-439 算法训练 简单字符变换
第十四届蓝桥杯集训——练习解题阶段(无序阶段)-ALGO-439 算法训练 简单字符变换
45 1
|
24天前
|
算法 C语言
数据结构和算法学习记录——栈和队列习题-用队列实现栈、用栈实现队列(核心思路、解题过程、完整题解)二
数据结构和算法学习记录——栈和队列习题-用队列实现栈、用栈实现队列(核心思路、解题过程、完整题解)二
18 2
|
17天前
|
算法
【经典LeetCode算法题目专栏分类】【第6期】二分查找系列:x的平方根、有效完全平方数、搜索二位矩阵、寻找旋转排序数组最小值
【经典LeetCode算法题目专栏分类】【第6期】二分查找系列:x的平方根、有效完全平方数、搜索二位矩阵、寻找旋转排序数组最小值
|
17天前
|
算法
【经典LeetCode算法题目专栏分类】【第4期】BFS广度优先算法:单词接龙、最小基因变化、二进制矩阵中的最短路径
【经典LeetCode算法题目专栏分类】【第4期】BFS广度优先算法:单词接龙、最小基因变化、二进制矩阵中的最短路径
|
2月前
|
算法 安全
死锁相关知识点以及银行家算法(解题详细步骤)
死锁相关知识点以及银行家算法(解题详细步骤)
34 2
|
24天前
|
算法 C语言
数据结构和算法学习记录——栈和队列习题-用队列实现栈、用栈实现队列(核心思路、解题过程、完整题解)一
数据结构和算法学习记录——栈和队列习题-用队列实现栈、用栈实现队列(核心思路、解题过程、完整题解)一
20 0
|
2月前
|
算法
【免费】面向多微网网络结构设计的大规模二进制矩阵优化算法
【免费】面向多微网网络结构设计的大规模二进制矩阵优化算法
|
2月前
|
算法 测试技术 Serverless
【二分查找】【C++算法】378. 有序矩阵中第 K 小的元素
【二分查找】【C++算法】378. 有序矩阵中第 K 小的元素