- 题目详述
编写一个高效的算法来判断 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
二.自我探寻
思路:二分法 时间复杂度O(log(mn)) 比较慢
代码:
public boolean searchMatrix(int[][] matrix, int target) {
if(matrix.length==0)
{
return false;
}
int m=matrix.length;
int n=matrix[0].length;
int i=0;
int j=m*n-1;
while(i<j)
{
int mid=(i+j)/2;
if(matrix[i/n][i%n]==target)
return true;
if(matrix[j/n][j%n]==target)
return true;
if(matrix[mid/n][mid%n]==target)
return true;
if(target>matrix[i/n][i%n]&&
target<matrix[mid/n][mid%n])
{
j=mid-1;
}
else if(target>matrix[mid/n][mid%n]&&
target<matrix[j/n][j%n])
{
i=mid+1;
}
else {
return false;
}
}
return false;
}
评价:
- 网络学习过程
思路:这道题的关键点在于利用矩阵升序的特性,需要选择合适的切入点与目标值相比较以缩小数据返围,很明显如果选择左上角或右下角当做切入点并不能起到只能分别排除一个选项,而如果选择右上角或者左下角进行比较即可起到更明显的效果。(引自leetcode评论)
时间复杂度O(m+n)
if(matrix.length==0)
{
return false;
}
int col=matrix[0].length-1;
int row=0;
for(;row<matrix.length;row++)
{
if(target<matrix[row][col])
{
break;
}
else if(target==matrix[row][col])
{
return true;
}
}
for(;col>=0;col++)
{
if(target==matrix[row][col])
{
return true;
}
else if(target>matrix[row][col])
{
return false;
}
}
return false;
}
评价:
四.Python实现