[解题报告]《算法零基础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;
}


相关文章
|
19小时前
|
算法
|
2月前
|
并行计算 算法 IDE
【灵码助力Cuda算法分析】分析共享内存的矩阵乘法优化
本文介绍了如何利用通义灵码在Visual Studio 2022中对基于CUDA的共享内存矩阵乘法优化代码进行深入分析。文章从整体程序结构入手,逐步深入到线程调度、矩阵分块、循环展开等关键细节,最后通过带入具体值的方式进一步解析复杂循环逻辑,展示了通义灵码在辅助理解和优化CUDA编程中的强大功能。
|
2月前
|
机器学习/深度学习 算法 搜索推荐
django调用矩阵分解推荐算法模型做推荐系统
django调用矩阵分解推荐算法模型做推荐系统
45 4
|
2月前
|
算法 Java 程序员
【算法每日一练及解题思路】有n级台阶,一次只能上1级或2级,共有多少种走法?
本文深入解析了“爬楼梯问题”,探讨了递归与迭代两种解法,并提供了Java代码实现。通过分析问题本质,帮助读者理解动态规划技巧,提高解决实际编程问题的能力。关键词:Java, 算法, 动态规划, 爬楼梯问题, 递归, 迭代。
119 0
|
2月前
|
存储 算法
动态规划算法学习一:DP的重要知识点、矩阵连乘算法
这篇文章是关于动态规划算法中矩阵连乘问题的详解,包括问题描述、最优子结构、重叠子问题、递归方法、备忘录方法和动态规划算法设计的步骤。
168 0
|
2月前
|
算法 C++
【算法解题思想】动态规划+深度优先搜索(C/C++)
【算法解题思想】动态规划+深度优先搜索(C/C++)
|
4月前
|
算法 Java
LeetCode经典算法题:矩阵中省份数量经典题目+三角形最大周长java多种解法详解
LeetCode经典算法题:矩阵中省份数量经典题目+三角形最大周长java多种解法详解
57 6
|
6月前
|
机器学习/深度学习 数据采集 人工智能
算法金 | 协方差、方差、标准差、协方差矩阵
**摘要:** 本文介绍了统计学中的基础概念,包括方差、标准差、协方差及其矩阵。方差衡量数据的分散程度,标准差是方差的平方根,提供相同单位下的波动度量。协方差则分析两个变量的关联性,正负值表示正负相关。协方差矩阵扩展到多变量情况,展示多个变量间的关系。这些工具在金融、质量控制、机器学习等领域有广泛应用。文章通过实例和公式清晰解释了每个概念,并强调理解它们之间的关系对于数据分析和统计建模的重要性。
82 0
算法金 | 协方差、方差、标准差、协方差矩阵
|
6月前
|
算法 C语言
数据结构和算法学习记录——栈和队列习题-用队列实现栈、用栈实现队列(核心思路、解题过程、完整题解)二
数据结构和算法学习记录——栈和队列习题-用队列实现栈、用栈实现队列(核心思路、解题过程、完整题解)二
44 2
|
6月前
|
算法
【经典LeetCode算法题目专栏分类】【第6期】二分查找系列:x的平方根、有效完全平方数、搜索二位矩阵、寻找旋转排序数组最小值
【经典LeetCode算法题目专栏分类】【第6期】二分查找系列:x的平方根、有效完全平方数、搜索二位矩阵、寻找旋转排序数组最小值