解法1:从矩阵左下角出发,每次排除一行或者一列,逐渐向矩阵右上角逼近
bool findNumberIn2DArray(int** matrix, int matrixSize, int* matrixColSize, int target){
if (matrixSize <= 0 || *matrix == NULL || matrix == NULL || matrixColSize == NULL || *matrixColSize <= 0)
return false;
int row = matrixSize-1, col = 0; //由矩阵左下角出发
int colMax = *matrixColSize-1;
while (row >= 0 && col <= colMax) { //每次配排除一行或者一列
if (matrix[row][col] > target)
row--;
else if (matrix[row][col] < target)
col++;
else
return true;
}
return false;
}
解法2:从矩阵右上角出发,每次排除一列或者一行,逐渐向矩阵左下角逼近
bool findNumberIn2DArray(int** matrix, int matrixSize, int* matrixColSize, int target){
if (matrixSize <= 0 || *matrix == NULL || matrix == NULL || matrixColSize == NULL || *matrixColSize <= 0)
return false;
int row = 0, col = *matrixColSize-1; //从右上角出发
int rowMax = matrixSize-1;
while (row <= rowMax && col >= 0) { //每次排除一列或者一行
if (matrix[row][col] > target)
col--;
else if (matrix[row][col] < target)
row++;
else
return true;
}
return false;
}
解法1和解法2的时间复杂度都是O(RowSize+ColSize)。
解法3:每次排除足够多的行和列(错误示例T_T)
注:是自己最初一个比较贪婪的想法,还是用代码表达了出来,实际不太成功,希望不要误导大家,最好不要费时看了,只是想贴出来留自己反思的。
此解法在leetcode上超时。个人分析主要有以下两个原因:
其一是,时间主要花在数组下标合法性检查上了,并且循环体内while的叠加更是常数系数增加了条件判断的次数,当测试例矩阵总体偏小时更加显著,效率比较低下。
其二是,循环体内一次想做的事情太多了,没有好好利用第一层循环的条件,这个是主要的思想错误。
bool findNumberIn2DArray(int** matrix, int matrixSize, int* matrixColSize, int target){
if (matrixSize <= 0 || *matrix == NULL || matrix == NULL || matrixColSize == NULL || *matrixColSize <= 0)
return false;
int row = 0, col = 0;
int rowMax = matrixSize-1, colMax = *matrixColSize-1;
while (row <= rowMax && col <= colMax) {
if (matrix[row][col] == target)
return true;
if (matrix[row][col] > target || matrix[rowMax][colMax] < target)
return false;
while (col <= colMax && matrix[rowMax][col] < target)
col++;
while (row <= rowMax && matrix[rowMax][col] > target)
rowMax--;
while (row <= rowMax && matrix[row][colMax] < target)
row++;
while (col <= colMax && matrix[row][colMax] > target)
colMax--;
}
return false;
}