编写一个高效的算法来判断 m x n 矩阵中,是否存在一个目标值。该矩阵具有如下特性:
- 每行中的整数从左到右按升序排列。
- 每行的第一个整数大于前一行的最后一个整数。
示例 1:
输入:
matrix = [
[1, 3, 5, 7],
[10, 11, 16, 20],
[23, 30, 34, 50]
]
target = 3
输出: true
示例 2:
输入:
matrix = [
[1, 3, 5, 7],
[10, 11, 16, 20],
[23, 30, 34, 50]
]
target = 13
输出: false
此题与剑指offer第四题相似
方法一:直接暴力遍历二维数组所有元素,时间复杂度为O(m*n)
方法二:对每一行使用一次二分查找,时间复杂度为O(m*logn)
方法三:根据简单的例子寻找规律,从右上角开始寻找,时间复杂度为O(m+n)
方法一: O(m*n)
方法二: O(m*logn)
方法三: O(m+n)
O(1)
C++:
class Solution {
public:
bool searchMatrix(vector<vector<int>>& matrix, int target) {
if (matrix.empty()) return false;
int m = matrix.size();
int n = matrix[0].size();
for (int i=0;i<m;i++)
{
for (int j=0;j<n;j++)
{
if (matrix[i][j]==target)
return true;
}
}
return false;
}
};
class Solution {
public:
bool searchMatrix(vector<vector<int>>& matrix, int target) {
if (matrix.empty()) return false;
int m = matrix.size();
int n = matrix[0].size();
for (int i=0;i<m;i++)
{
int start = 0;
int end = n-1;
while(end>=start)
{
int mid = start+(end-start)/2;
if (matrix[i][mid]==target)
return true;
else if (matrix[i][mid]<target)
start=mid+1;
else if (matrix[i][mid]>target)
end=mid-1;
}
}
return false;
}
};
class Solution {
public:
bool searchMatrix(vector<vector<int>>& matrix, int target) {
if (matrix.empty()) return false;
int m = matrix.size();
int n = matrix[0].size();
int start = 0;
int end = m*n-1;
while(end>=start)
{
int mid = start+(end-start)/2;
if (matrix[mid/n][mid%n]==target)
return true;
else if (matrix[mid/n][mid%n]<target)
start=mid+1;
else if (matrix[mid/n][mid%n]>target)
end=mid-1;
}
return false;
}
};
class Solution {
public:
bool searchMatrix(vector<vector<int>>& matrix, int target) {
if (matrix.empty()) return false;
int m = matrix.size();
int n = matrix[0].size();
int i=0,j=n-1;
while(i<m && j>=0)
{
if (matrix[i][j]==target)
return true;
if (matrix[i][j]>target)
j--; //左移
else
i++; // 下移
}
return false;
}
};
class Solution {
public:
bool searchMatrix(vector<vector<int>>& matrix, int target) {
if (matrix.empty()) return false;
int m = matrix.size();
int n = matrix[0].size();
int i=m-1,j=0;
while(i>=0&& j<n)
{
if (matrix[i][j]==target)
return true;
if (matrix[i][j]>target)
i--; //上移
else
j++; // 右移
}
return false;
}
};
class Solution:
def searchMatrix(self, matrix: List[List[int]], target: int) -> bool:
m=len(matrix)
if m==0:
return False
n=len(matrix[0])
for i in range(m):
for j in range(n):
if matrix[i][j]==target:
return True
return False
class Solution:
def searchMatrix(self, matrix: List[List[int]], target: int) -> bool:
m=len(matrix)
if m==0:
return False
n=len(matrix[0])
for i in range(m):
start = 0
end = n-1
while end>=start:
mid = start + (end-start)//2
if matrix[i][mid] == target:
return True
if matrix[i][mid]<target:
start=mid+1
if matrix[i][mid]>target:
end=mid-1
return False
class Solution:
def searchMatrix(self, matrix: List[List[int]], target: int) -> bool:
m=len(matrix)
if m==0:
return False
n=len(matrix[0])
start = 0
end = m*n-1
while end>=start:
mid = start + (end-start)//2
if matrix[mid//n][mid%n] == target:
return True
if matrix[mid//n][mid%n]<target:
start=mid+1
if matrix[mid//n][mid%n]>target:
end=mid-1
return False
class Solution:
def searchMatrix(self, matrix: List[List[int]], target: int) -> bool:
m=len(matrix)
if m==0:
return False
n=len(matrix[0])
i=0
j=n-1
while i<m and j>=0:
if matrix[i][j]==target:
return True
elif matrix[i][j]>target:
j-=1
else:
i+=1
return False
class Solution:
def searchMatrix(self, matrix: List[List[int]], target: int) -> bool:
m=len(matrix)
if m==0:
return False
n=len(matrix[0])
i=m-1
j=0
while i>=0 and j<n:
if matrix[i][j]==target:
return True
elif matrix[i][j]>target:
i-=1
else:
j+=1
return False