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

一、 最富有客户的资产总量

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

题目描述

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

思路分析

循环遍历,找出和最大即可。

具体代码
class Solution {
public:
    int maximumWealth(vector<vector<int>>& accounts) {
        int maxv=0;
        int n=accounts.size(),m=accounts[0].size();
        for(int i=0;i<n;i++){
            int sum=0;
            for(int j=0;j<m;j++){
                sum+=accounts[i][j];
            }
            maxv=max(maxv,sum);
        }
        return maxv;
    }
};

二、二进制矩阵中的特殊位置

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

题目描述

给你一个大小为 rows x cols 的矩阵 mat,其中 mat[i][j] 是 0 或 1,请返回 矩阵 mat 中特殊位置的数目 。特殊位置 定义:如果 mat [i] [j] == 1 并且第 i 行和第 j 列中的所有其他元素均为 0(行和列的下标均 从 0 开始 ),则位置 (i, j) 被称为特殊位置。

思路分析

先遍历一次这个二维矩阵,统计每一行和每一列1的个数;之后再次遍历这个二维矩阵,若满足条件mat[i][j]==1 && rows[i]==1 && cols[j]==1 ,则认为(i,j)是一个特殊位置,ans++即可。最后返回ans。

具体代码
class Solution {
public:
    int rows[100];
    int cols[100];
    int numSpecial(vector<vector<int>>& mat) {
        int n=mat.size();
        int m=mat[0].size();
        for(int i=0;i<n;i++){
            for(int j=0;j<m;j++){
                rows[i]+=mat[i][j];
                cols[j]+=mat[i][j];
            }
        }
        int ans=0;
        for(int i=0;i<n;i++){
            for(int j=0;j<m;j++){
                if(mat[i][j]==1 && rows[i]==1 && cols[j]==1){
                    ans++;
                }
            }
        }
        return ans;
    }
};

三、翻转图像

力扣:832.翻转图像

题目描述

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

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

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

思路分析

由题意可知,水平翻转的意思就是des [i] [j] = image [i] [m-1-j] 即第i行的第j个和第i行的m-1-j个交换(事先保存原数组);

反转图片的意思就是,因为只有1和0,对对应的数字与1进行异或,即可满足要求。

具体代码
class Solution {
public:
    vector<vector<int>> flipAndInvertImage(vector<vector<int>>& image) {
        int n=image.size();
        int m=image[0].size();
        vector<vector<int>> des(n,vector<int>(m));
        for(int i=0;i<n;i++){
            for(int j=0;j<m;j++){
                des[i][j]=image[i][m-1-j];
                des[i][j]^=1;
            }
        }
        return des;
    }
};

四、旋转图像

力扣:48. 旋转图像

题目描述

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

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

思路分析

先保存一下之前的矩阵,旋转90°,你会发现新矩阵的第i行是原矩阵的第j列;而新矩阵的第j列是原矩阵的第n-1-j行。再看旋转之后的(i,j)这个位置,它是由原矩阵的(n-j-1,i)得到的。从而 matrix[i] [j]=temp [n-j-1] [i];

具体代码
class Solution {
public:
    void rotate(vector<vector<int>>& matrix) {
        int n=matrix.size();
        vector<vector<int>> temp(matrix);
        for(int i=0;i<n;i++){
            for(int j=0;j<n;j++){
                matrix[i][j]=temp[n-j-1][i];
            }
        }
    }
};

五、转置矩阵

力扣:867.转置矩阵

题目描述

给你一个二维整数数组 matrix, 返回 matrix转置矩阵

矩阵的 转置 是指将矩阵的主对角线翻转,交换矩阵的行索引与列索引。

思路分析

进行转置,就是行变成列,列变成行。即ans [j] [i]=matrix [i] [j] 即可;

具体代码
class Solution {
public:
    vector<vector<int>> transpose(vector<vector<int>>& matrix) {
        int n=matrix.size(),m=matrix[0].size();
        vector<vector<int>> ans(m,vector<int> (n));
        for(int i=0;i<n;i++){
            for(int j=0;j<m;j++){
                ans[j][i]=matrix[i][j];
            }
        }
        return ans;
    }
};

六、将一维数组转变二维数组

力扣:2022.将一维数组转变二维数组

题目描述

给你一个下标从 0 开始的一维整数数组 original 和两个整数 m 和 n 。你需要使用 original 中 所有 元素创建一个 m 行 n 列的二维数组。

original 中下标从 0 到 n - 1 (都 包含 )的元素构成二维数组的第一行,下标从 n 到 2 * n - 1 (都 包含 )的元素构成二维数组的第二行,依此类推。

请你根据上述过程返回一个 m x n 的二维数组。如果无法构成这样的二维数组,请你返回一个空的二维数组。

思路分析

按照题意进行模拟即可

具体代码
class Solution {
public:
    vector<vector<int>> construct2DArray(vector<int>& original, int m, int n) {
        int cnt=original.size();
        vector<vector<int>> ans;
        if(cnt!=m*n)    return ans;
        ans.resize(m);
        for(int i=0;i<m;i++)    ans[i].resize(n);//m是行
        int r=0,c=0;
        for(int i=0;i<cnt;i++){
            ans[r][c]=original[i];
            c++;
            if(c==n){
                c=0;
                r++;
            }
        }
        return ans;
    }
};
  • 7
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 9
    评论
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值