文章目录
前言
二维函数比一维函数更加灵活,需要反复掌握,此题集为必须掌握内容,值得反复推敲
一、二维函数传参
1.先回忆下一维函数
int add(int *nums, int numsSize) {
// ...
}
2.二位函数
int diagonalSum(int** mat, int matSize, int* matColSize){
}
1. matSize代表二维数组第一维的大小(有多少行)
2.int*matcolsize是一个一维数组,代表每一行有多少列(matcolsize[0]代表第0行有matcolsize[0]列, matcolsize[i]代表第i行有matcolsize[i]列)
3.一般初始化
int diagonalSum(int** mat, int matSize, int* matColSize){
row = matSize;
col = matColSize[0];
// TODO
}
二、托普利茨矩阵(传送门)
给你一个 m x n 的矩阵 matrix 。如果这个矩阵是托普利茨矩阵,返回 true ;否则,返回 false 。
如果矩阵上每一条由左上到右下的对角线上的元素都相同,那么这个矩阵是 托普利茨矩阵 。
示例 1:
输入:matrix = [[1,2,3,4],[5,1,2,3],[9,5,1,2]]
输出:true
解释:
在上述矩阵中, 其对角线为:
"[9]", "[5, 5]", "[1, 1, 1]", "[2, 2, 2]", "[3, 3]", "[4]"。
各条对角线上的所有元素均相同, 因此答案是 True 。
🔑思路:
1.编写一个额外的函数判断这一条斜线是否都相同
1.如果超出行或者超出列都返回false
2.判断之后的每一个数是否都和第一个数一样
2.分别从行和列遍历判断
//checkSame这个函数表示从(sr , sc)这个位置往斜下角的元素是否都相等,相等返回true,否则返回false
int check(int** arr, int srow, int scol, int maxrow, int maxcol){
int step = 0;
while(1){
//行越界,直接停下来
if(step + srow >= maxrow){
break;
}
//列越界,直接停下来
if(step + scol >= maxcol){
break;
}
//有一个元素和起始元素不相等,则直接返回false
if(arr[step + srow][step + scol] != arr[srow][scol]){
return false;
}
//往前走一步
step++;
}
return true;
}
bool isToeplitzMatrix(int** matrix, int matrixSize, int* matrixColSize){
int row = matrixSize;
int col = matrixColSize[0];
for(int i = 0; i < row; i++){
//检查从第一列的每个元素往右下角走的情况
if(!check(matrix, i, 0, row, col)){
return false;
}
}
for(int i = 0; i < col; i++){
//检查从第一行的每个元素往右下角走的情况;
if(!check(matrix, 0, i, row, col)){
return false;
}
}
return true;
}
三、矩阵中的幸运数(传送门)
给你一个 m * n 的矩阵,矩阵中的数字 各不相同 。请你按 任意 顺序返回矩阵中的所有幸运数。
幸运数是指矩阵中满足同时下列两个条件的元素:
在同一行的所有元素中最小
在同一列的所有元素中最大
示例 1:
输入:matrix = [[3,7,8],[9,11,13],[15,16,17]]
输出:[15]
解释:15 是唯一的幸运数,因为它是其所在行中的最小值,也是所在列中的最大值。
🔑思路:
1.首先找出每一行中的最小值,存起来
2.再找出每一列中的最大值,存起来
3.接着遍历每一行的最小值和每一列的最大值,并存储起来
/**
* Note: The returned array must be malloced, assume caller calls free().
*/
int min(int a, int b) {
return a < b ? a : b;
}
int max(int a, int b) {
return a > b ? a : b;
}
int* luckyNumbers (int** matrix, int matrixSize, int* matrixColSize, int* returnSize){
*returnSize = 0;
int row = matrixSize;
int col = matrixColSize[0];
int* arr = (int*)malloc(sizeof(int)*row*col);
int rowmin[100] ;
int colmax[100] ;
memset(rowmin, 1000000, sizeof(int)*100);
memset(colmax, 0, sizeof(int)*100);
//rmin[i]存储第i行的最小值
for(int i = 0; i < row; i++){
for(int j = 0; j < col; j++){
rowmin[i] = min(rowmin[i], matrix[i][j]);
}
}
//cmax[j]存储第j列的最大值
for(int j = 0; j < col; j++){
for(int i = 0; i < row; i++){
colmax[j] = max(colmax[j], matrix[i][j]);
}
}
//对同时满足行最小,列最大的元素放入结果数组
for(int i = 0; i < row; i++){
for(int j = 0; j < col; j++){
if(matrix[i][j] == rowmin[i] && matrix[i][j] == colmax[j]){
arr[(*returnSize)++] = matrix[i][j];
}
}
}
return arr;
}
总结
二维数组,嵌套循环判断。