搜索二维矩阵(leetcode)
leetcode链接搜索二维矩阵
##题目描述
编写一个高效的算法来判断 m x n 矩阵中,是否存在一个目标值。该矩阵具有如下特性:
每行中的整数从左到右按升序排列。
每行的第一个整数大于前一行的最后一个整数。
示例 1:
输入:matrix = [[1,3,5,7],[10,11,16,20],[23,30,34,60]], target = 3
输出:true
示例 2:
输入:matrix = [[1,3,5,7],[10,11,16,20],[23,30,34,60]], target = 13
输出:false
提示:
m == matrix.length
n == matrix[i].length
1 <= m, n <= 100
-104 <= matrix[i][j], target <= 104
其实就是一个有序的二维数组,然后查找是否有某一个数。
bool searchMatrix(int** matrix, int matrixSize, int* matrixColSize, int target){
int m = matrixSize, n = matrixColSize[0],i=0,j;
if(m==1&&n==1)
return matrix[0][0]==target;
while( i!=m && matrix[i][n-1]<target)
{
i++;
}
if(i==m)
return false;
j=0;
while(j<n)
{
if(matrix[i][j]==target)
return true;
j++;
}
普通的算法其实很简单,但有一个很坑人的地方在leetcode上面提交会出现问题。
while( i!=m && matrix[i][n-1]<target)
这句话不能写成
while(matrix[i][n-1]<target && i!=m)
今天做题的时候被坑了好久。初看其实没什么问题,但仔细琢磨就会发现如果target比数组中的任何一个数都大的话,那么最后一次while循环后i=m再次进行while循环条件的判定如果先判断
matrix[i][n-1]<target
就会出现错误,因为matrix[i][]并不存在。所以就会报错。
这个错误在编译器上可能 并不会报错,但这个细节确实需要掌握,因为很细节哈哈。
leetcode上的进阶操作解题方法
两次二分查找
int binarySearchFirstColumn(int** matrix, int matrixSize, int target) {
int low = -1, high = matrixSize - 1;
while (low < high) {
int mid = (high - low + 1) / 2 + low;
if (matrix[mid][0] <= target) {
low = mid;
} else {
high = mid - 1;
}
}
return low;
}
bool binarySearchRow(int* row, int rowSize, int target) {
int low = 0, high = rowSize - 1;
while (low <= high) {
int mid = (high - low) / 2 + low;
if (row[mid] == target) {
return true;
} else if (row[mid] > target) {
high = mid - 1;
} else {
low = mid + 1;
}
}
return false;
}
bool searchMatrix(int** matrix, int matrixSize, int* matrixColSize, int target) {
int rowIndex = binarySearchFirstColumn(matrix, matrixSize, target);
if (rowIndex < 0) {
return false;
}
return binarySearchRow(matrix[rowIndex], matrixColSize[rowIndex], target);
}
一次二分查找
bool searchMatrix(int** matrix, int matrixSize, int* matrixColSize, int target) {
int m = matrixSize, n = matrixColSize[0];
int low = 0, high = m * n - 1;
while (low <= high) {
int mid = (high - low) / 2 + low;
int x = matrix[mid / n][mid % n];
if (x < target) {
low = mid + 1;
} else if (x > target) {
high = mid - 1;
} else {
return true;
}
}
return false;
}