74. 搜索二维矩阵https://leetcode.cn/problems/search-a-2d-matrix/
难度中等654
编写一个高效的算法来判断 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
通过次数235,450提交次数495,541
方法一:两次查找
一次列查找+一次行查找。
时间复杂度:列查找O(m) 行查找O(n) 总的时间复杂度O(m+n)
空间复杂度:O(1)
class Solution {
public boolean searchMatrix(int[][] matrix, int target) {
int x=0;
boolean flag = false;
for(int i=0;i<matrix.length;i++)
{
// System.out.println(matrix[i][0]);
if(matrix[i][0] <= target && matrix[i][matrix[i].length-1]>=target)
{
x=i;
}
}
for(int i=0;i<matrix[0].length;i++)
{
if(matrix[x][i]==target) flag = true;
}
return flag;
}
}
方法二:两次二分查找
一次列二分,一次行二分。
时间复杂度:列二分O(logm) 行二分O(logn) 总的时间复杂度:O(logmn)
空间复杂度:O(1)
class Solution {
public boolean searchMatrix(int[][] matrix, int target) {
//两次二分查找:一次列二分查找,一次行二分查找
if(matrix[matrix.length-1][matrix[0].length-1]<target) return false;
int start = 0;
int end;
int mid=0;
//列二分
end = matrix.length-1;
while(start<=end)
{
mid = (end-start)/2+start;
System.out.println(mid);
if(matrix[mid][0]==target) return true;
else if(matrix[mid][0]<target && (mid==matrix.length-1 || matrix[mid+1][0]>target)) break;
else if(matrix[mid][0]<target) start = mid+1;
else end = mid-1;
}
int x = mid;
//行二分
start = 0;
end = matrix[0].length-1;
while(start<=end)
{
mid = (end-start)/2+start;
if(matrix[x][mid]==target) return true;
else if(matrix[x][mid]>target) end = mid-1;
else start = mid+1;
}
return false;
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/69085.html