《九日集训》第十五轮 (第七讲) 二维数组

知识点

二维数组

int diagonalSum(int** mat, int matSize, int* matColSize){
r = matSize;
c = matColSize[0];
// TODO
}

题目分析

题目1

1351. 统计有序矩阵中的负数

分析

因为矩阵是有序的,所以每一行的数据个数等于每行数组长度减去第一个负数的位置

代码

class Solution {
public:
int countNegatives(vector<vector<int>>& grid) {
int res=0;
for(auto gr:grid){
for(int i=0;i<gr.size();i++){
if(gr[i]<0){
res+=gr.size()-i;
break;
}
}
}
return res;
}
};

题目2

1572. 矩阵对角线元素的和

分析

暴力大法(bushi),直接求出对角线的坐标,记得当长度为奇数的时候要减去中间的那个数

代码

class Solution {
public:
int diagonalSum(vector<vector<int>>& mat) {
int res=0;
for(int i=0,j=mat.size()-1;i<mat.size()&&j>=0;i++,j--){
res+=mat[i][i]+mat[i][j];
}
if(mat.size()%2)res-=mat[mat.size()-1>>1][mat.size()-1>>1];
return res;
}
};

题目3

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

分析

对该矩阵的每层数组的和求最大值

代码

class Solution {
public:
int maximumWealth(vector<vector<int>>& accounts) {
int res=0;
for(auto acc:accounts){
int sum=0;
for(auto ac:acc){
sum+=ac;
res=max(res,sum);
}
}
return res;
}
};

题目4

766. 托普利茨矩阵

分析

二重循环枚举每一条对角线,进阶的看不懂是什么意思qwq

代码

class Solution {
public:
bool isToeplitzMatrix(vector<vector<int>>& matrix) {
for(int i=0;i<matrix.size();i++)
for(int j=0;j<matrix[0].size();j++)
if(i>0&&j>0 &&matrix[i][j]!=matrix[i-1][j-1])return false;
return true;
}
};

题目5

1380. 矩阵中的幸运数

分析

暴力枚举法,枚举每一行的最小值以及最小值所在的列的最大值是否与最小值相等,相等的话把结果存入数组

代码

class Solution {
public:
vector<int> luckyNumbers (vector<vector<int>>& matrix) {
int temp=0;
vector<int>res;
for(int i=0;i<matrix.size();i++){
int min=INT_MAX,max=0;
for(int j=0;j<matrix[0].size();j++){
if(min>matrix[i][j]){
min=matrix[i][j];
temp=j;
}
}
for(int j=0;j<matrix.size();j++){
if(max<matrix[j][temp]){
max=matrix[j][temp];
}
}
if(max==min) res.push_back(max);
}
return res;
}
};

题目6

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

分析

本质上是检查同一行的行和总和与同一行的列的总和是否都为1,思路同1380. 矩阵中的幸运数

代码

class Solution {
public:
int numSpecial(vector<vector<int>>& mat) {
int temp,res=0;
for(int i=0;i<mat.size();i++){
int sum_x=0,sum_y=0;
for(int j=0;j<mat[0].size();j++){
sum_y+=mat[i][j];
if(mat[i][j]==1){
//记录总和为1的列
temp=j;
}
if(sum_y==0) temp=-1;
//和大于2结束循环
if(sum_y>1){
temp=-1;
break;
}
}
if(temp==-1)continue;
for(int j=0;j<mat.size();j++){
if(sum_y==1){
//计算和为1的列的和
sum_x+=mat[j][temp];
//大于1跳出循环
if(sum_x>1)break;
}
}
if(sum_x==1)res++;
}
return res;
}
};

题目7

1827. 最少操作使数组递增

分析

直接遍历二维数组,遇到一个陆地直接加4,如果周围有陆地就行了

代码

class Solution {
public:
int islandPerimeter(vector<vector<int>>& grid) {
int res=0;
for(int i=0;i<grid.size();i++){
for(int j=0;j<grid[0].size();j++){
if(grid[i][j]==1){
res+=4;
//下边
if(i+1<grid.size()&&grid[i+1][j]==1)res--;
//右边
if(j+1<grid[0].size()&&grid[i][j+1]==1)res--;
//左边
if(j-1>=0&&grid[i][j-1]==1)res--;
//上边
if(i-1>=0&&grid[i-1][j]==1)res--;
}
}
}
return res;
}
};

总结

感觉对模拟二维数组这个知识点很不熟练qwq,连一道简单题都想了好久
image

本文作者:灰之魔女伊蕾娜

本文链接:https://www.cnblogs.com/daohengdao/p/16095521.html

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   灰之魔女伊蕾娜  阅读(33)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
展开