Leetcode 240. Search a 2D Matrix II
题目
这道题目有很多不同的解法,我这边的两种是leetcode官方解答中没有出现的,个人认为这两种方法比较直观也在面试中容易想到
解法1:按行二分搜索
由于每一行每一列都是排好序的,所以可以按行或者按列进行二分搜索,时间复杂度为O(mlog(n))或者O(nlog(m)),这边下面写了按行二分的方法,按列也一样
class Solution:
def searchMatrix(self, matrix, target):
"""
:type matrix: List[List[int]]
:type target: int
:rtype: bool
"""
def binary_search(row):
l,h = 0,n-1
while l<=h:
mid = l+(h-l)//2
if matrix[row][mid] == target:
return True
elif matrix[row][mid] > target:
h = mid-1
else:
l = mid+1
return False
if not matrix or not matrix[0]:
return False
m = len(matrix)
n = len(matrix[0])
for i in range(m):
if binary_search(i):
return True
return False
C++版本代码如下:
C++这种解法居然没过!!!很神奇,因为python提交的结果第一种解法和第二种解法的时间几乎是一致的。
class Solution {
public:
bool searchMatrix(vector<vector<int>>& matrix, int target) {
if (matrix.empty()){
return false;
}
int m = matrix.size(), n = matrix[0].size();
for (int i=0;i<m;i++){
if (binary_search(matrix[i],n,target)) return true;
}
return false;
}
bool binary_search(vector<int> row, int n, int target){
int l = 0, h = n-1;
while (l<=h){
int mid = l+(h-l)/2;
if (row[mid] == target){
return true;
}else if (row[mid]>target){
h = mid-1;
}else{
l = mid+1;
}
}
return false;
}
};
解法2:O(m+n)
这道题有一个简单的技巧:我们可以从右上角开始查找,若当前值大于待搜索值,我们向左 移动一位;若当前值小于待搜索值,我们向下移动一位。如果最终移动到左下角时仍不等于待搜 索值,则说明待搜索值不存在于矩阵中。这种方法复杂度为O(m+n)应该是最优解法,但是没体现二分查找的思想是真的
python代码如下:
class Solution:
def searchMatrix(self, matrix, target):
"""
:type matrix: List[List[int]]
:type target: int
:rtype: bool
"""
if not matrix or not matrix[0]:
return False
m,n = len(matrix),len(matrix[0])
i,j = 0,n-1
while i<m and j>=0:
if matrix[i][j] > target:
j -= 1
elif matrix[i][j]<target:
i += 1
else:
return True
return False
C++版本如下:
class Solution {
public:
bool searchMatrix(vector<vector<int>>& matrix, int target) {
if (matrix.empty()){
return false;
}
int m = matrix.size(), n = matrix[0].size();
int i = 0, j = n-1;
while (i<m and j>=0){
if (matrix[i][j]>target){
j--;
}else if (matrix[i][j]<target){
i++;
}else return true;
}
return false;
}
};