《九日集训》第十五轮 (第七讲) 二维数组
知识点
二维数组
int diagonalSum(int** mat, int matSize, int* matColSize){ r = matSize; c = matColSize[0]; // TODO }
题目分析
题目1
分析
因为矩阵是有序的,所以每一行的数据个数等于每行数组长度减去第一个负数的位置
代码
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
分析
暴力大法(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
分析
对该矩阵的每层数组的和求最大值
代码
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
分析
二重循环枚举每一条对角线,进阶的看不懂是什么意思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
分析
暴力枚举法,枚举每一行的最小值以及最小值所在的列的最大值是否与最小值相等,相等的话把结果存入数组
代码
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
分析
本质上是检查同一行的行和总和与同一行的列的总和是否都为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
分析
直接遍历二维数组,遇到一个陆地直接加,如果周围有陆地就行了
代码
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,连一道简单题都想了好久
本文作者:灰之魔女伊蕾娜
本文链接:https://www.cnblogs.com/daohengdao/p/16095521.html
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步