文章目录
一、 最富有客户的资产总量
题目描述
给你一个 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;
}
};
二、二进制矩阵中的特殊位置
题目描述
给你一个大小为 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;
}
};
三、翻转图像
题目描述
给定一个二进制矩阵 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;
}
};
四、旋转图像
题目描述
给定一个 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];
}
}
}
};
五、转置矩阵
题目描述
给你一个二维整数数组
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;
}
};
六、将一维数组转变二维数组
题目描述
给你一个下标从 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;
}
};