题目描述
编写一个高效的算法来判断 m x n 矩阵中,是否存在一个目标值。该矩阵具有如下特性:
每行中的整数从左到右按升序排列。
每行的第一个整数大于前一行的最后一个整数。
题目解析
思路:可以将二维矩阵想象成一维的,一个升序的一维数组;
方法一:最暴力的方法就是直接从第一位数遍历,遍历是否有一个数和target相等。
方法二:可以使用二分查找的思想来解决,从nLeft=0到nRight=mn-1进行搜索,计算的中间位置nMid,因为是二维的数组需要将nMid转换成行Y和列X,nMix/n(n是矩阵的列数)可以等到行Y,然后nMix-nY可以得到列X。
代码实现
方案一实现代码:
class Solution {
public:
bool searchMatrix(vector< vector<int> >& matrix, int target) {
for(int i=0; i<matrix.size(); i++) {
for(int j=0; j<matrix[i].size(); j++) {
if(matrix[i][j] == target) {
return true;
}
}
}
return false;
}
};
方案二实现代码:
class Solution {
public:
bool searchMatrix(vector< vector<int> >& matrix, int target) {
int nRight = matrix.size() * matrix[0].size() - 1;
int nLetf = 0;
int nWidth = matrix[0].size();
int nHeight = matrix.size();
while(nLetf <= nRight) {
int nMid = (nLetf + nRight) / 2;
int y = nMid / nWidth;
int x = nMid - y * nWidth;
if(matrix[y][x] == target) {
return true;
}
else if(matrix[y][x] < target) {
nLetf = nMid + 1;
}
else {
nRight = nMid - 1;
}
}
return false;
}
};