《九日集訓》第十五輪 (第七講) 二維陣列
阿新 • • 發佈:2022-04-03
知識點
二維陣列
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
分析
直接遍歷二維陣列,遇到一個陸地直接加\(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,連一道簡單題都想了好久