练习题
1 题目描述 1351.统计有序矩阵中的负数
给你一个 m * n
的矩阵 grid
,矩阵中的元素无论是按行还是按列,都以非递增顺序排列。
请你统计并返回 grid
中 负数 的数目
class Solution {
public:
int countNegatives(vector<vector<int>>& grid)
{
int rows=grid.size();
int cols=grid[0].size();
int cnt=0;
for(int i=0;i<rows;i++)
{
for(int j=0;j<cols;j++)
{
if(grid[i][j]<0)
{
cnt+=cols-j;
break;
}
}
}
return cnt;
}
};
2 题目描述 1572.矩阵对角线元素的和
给你一个正方形矩阵 mat
,请你返回矩阵对角线元素的和。
请你返回在矩阵主对角线上的元素和副对角线上且不在主对角线上元素的和。
class Solution {
public:
int diagonalSum(vector<vector<int>>& mat)
{
int rows=mat.size();
int cols=mat[0].size();
int sum=0;
for(int i=0;i<rows;i++)
{
for(int j=0;j<cols;j++)
{
if(i==j)
{
sum+=mat[i][j];
}
else if(i+j==cols-1)
{
sum+=mat[i][j];
}
}
}
return sum;
}
};
3 题目描述 1672.最富有客户的资产总量
给你一个 m x n 的整数网格 accounts ,其中 accounts[i][j] 是第 i 位客户在第 j 家银行托管的资产数量。返回最富有客户所拥有的 资产总量 。
客户的 资产总量 就是他们在各家银行托管的资产数量之和。最富有客户就是 资产总量 最大的客户。
class Solution {
public:
int maximumWealth(vector<vector<int>>& accounts)
{
int rows=accounts.size();
int cols=accounts[0].size();
int max=0;
for(int i=0;i<rows;i++)
{
int sum=0;
for(int j=0;j<cols;j++)
{
sum+=accounts[i][j];
if(sum>max)
{
max=sum;
}
}
}
return max;
}
};
4 题目描述 766.托普利茨矩阵
给你一个 m x n 的矩阵 matrix 。如果这个矩阵是托普利茨矩阵,返回 true ;否则,返回 false 。
如果矩阵上每一条由左上到右下的对角线上的元素都相同,那么这个矩阵是 托普利茨矩阵 。
class Solution {
public:
bool isToeplitzMatrix(vector<vector<int>>& matrix)
{
int rows=matrix.size();
int cols=matrix[0].size();
for(int i=0;i<rows;i++)
{
for(int j=0;j<cols;j++)
{
if(i>0&&j>0&&matrix[i-1][j-1]!=matrix[i][j])
{
return false;
}
}
}
return true;
}
};
//注意转换思维,不要死板的去比较每个对角线
5 题目描述 1380.矩阵中的幸运数
给你一个 m * n 的矩阵,矩阵中的数字 各不相同 。请你按 任意 顺序返回矩阵中的所有幸运数。
幸运数是指矩阵中满足同时下列两个条件的元素:
在同一行的所有元素中最小
在同一列的所有元素中最大
class Solution {
public:
vector<int> luckyNumbers (vector<vector<int>>& matrix)
{
int rows=matrix.size();
int cols=matrix[0].size();
//初始化
//row[i] 表示 第 i 行的最小值在第row[i] 列
//col[i] 表示 第 i 列的最大值在第col[i] 行
vector<int> row(rows,0);
vector<int> col(cols,0);
vector<int> res;
for(int i=0;i<rows;i++)
{
for(int j=0;j<cols;j++)
{
if(matrix[i][j]<matrix[i][row[i]])
{
row[i]=j;
}
if(matrix[i][j]>matrix[col[j]][j])
{
col[j]=i;
}
}
}
for(int i=0;i<rows;i++)
{
if(i==col[row[i]])
{
res.push_back(matrix[i][row[i]]);
}
}
return res;
}
};
//定义向量变量,塞入数据,最后以向量形式输出
6 题目描述 1582.二进制矩阵中的特殊位置
给你一个大小为 rows x cols 的矩阵 mat,其中 mat[i][j] 是 0 或 1,请返回 矩阵 mat 中特殊位置的数目 。
特殊位置 定义:如果 mat[i][j] == 1 并且第 i 行和第 j 列中的所有其他元素均为 0(行和列的下标均 从 0 开始 ),则位置 (i, j) 被称为特殊位置。
class Solution {
public:
int numSpecial(vector<vector<int>>& mat)
{
int rows=mat.size();
int cols=mat[0].size();
int cnt=0;
for(int i=0;i<rows;i++)
{
for(int j=0;j<cols;j++)
{
if(mat[i][j]==1)
{
int sum=0;
for(int n=0;n<cols;n++)
{
int m=i;
sum+=mat[m][n];
}
for(int m=0;m<rows;m++)
{
int n=j;
sum+=mat[m][n];
}
if(sum==2)
{
cnt++;
}
}
}
}
return cnt;
}
};
7 题目描述 463.岛屿的周长
给定一个 row x col 的二维网格地图 grid ,其中:grid[i][j] = 1 表示陆地, grid[i][j] = 0 表示水域。
网格中的格子 水平和垂直 方向相连(对角线方向不相连)。整个网格被水完全包围,但其中恰好有一个岛屿(或者说,一个或多个表示陆地的格子相连组成的岛屿)。
岛屿中没有“湖”(“湖” 指水域在岛屿内部且不和岛屿周围的水相连)。格子是边长为 1 的正方形。网格为长方形,且宽度和高度均不超过 100 。计算这个岛屿的周长
class Solution {
public:
int islandPerimeter(vector<vector<int>>& grid)
{
int rows=grid.size();
int cols=grid[0].size();
int cnt=0;
int cover=0;
for(int i=0;i<rows;i++)
{
for(int j=0;j<cols;j++)
{
if (grid[i][j] == 1)
{
cnt++;
// 统计上边相邻陆地
if(i - 1 >= 0 && grid[i - 1][j] == 1) cover++;
// 统计左边相邻陆地
if(j - 1 >= 0 && grid[i][j - 1] == 1) cover++;
// 为什么没统计下边和右边? 因为避免重复计算
}
}
}
return cnt*4-cover*2;
}
};
//卷积
//BFS DFS
//数学方法 按岛屿求或者按水域求 if(i==0||grid[j][i-1]==0)
//圈0法