编写一个高效的算法来判断 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
leetcode 378. 有序矩阵中第K小的元素(Kth Smallest Element in a Sorted Matrix)
我的做法还是和上面的378号题一样,优先队列,效率还能接受,15ms,最快的是6ms,beat 34.86%
class Solution {
public boolean searchMatrix(int[][] matrix, int target) {
int n = matrix.length;
if(n<1 || matrix[0].length<1 || target<matrix[0][0] || target>matrix[n-1][matrix[0].length-1])
return false;
PriorityQueue<Tuple> pq = new PriorityQueue<>();
for(int i=0;i<matrix[0].length;i++)
pq.add(new Tuple(0, i, matrix[0][i]));
while(!pq.isEmpty()) {
Tuple t = pq.poll();
if(t.val == target)
return true;
if(t.val<target) {
if(t.x==n-1)
continue;
pq.add(new Tuple(t.x+1, t.y, matrix[t.x+1][t.y]));
}
}
return false;
}
class Tuple implements Comparable<Tuple>{
int x;
int y;
int val;
@Override
public int compareTo(Tuple o) {
return this.val - o.val;
}
public Tuple(int x,int y,int val) {
this.x = x;
this.y =y;
this.val = val;
}
public Tuple() {}
}
}
leetcode外网vote最高的解法
/**
* Do binary search in this "ordered" matrix
*/
public boolean searchMatrix(int[][] matrix, int target) {
int row_num = matrix.length;
int col_num = matrix[0].length;
int begin = 0, end = row_num * col_num - 1;
while(begin <= end){
int mid = (begin + end) / 2;
int mid_value = matrix[mid/col_num][mid%col_num];
if( mid_value == target){
return true;
}else if(mid_value < target){
//Should move a bit further, otherwise dead loop.
begin = mid+1;
}else{
end = mid-1;
}
}
return false;
}
很简洁
public boolean searchMatrix(int[][] matrix, int target) {
if(matrix.length==0||matrix[0].length==0) return false;
int i = 0, j = matrix[0].length-1;
while(i<matrix.length&&j>=0){
if(matrix[i][j]==target) return true;
else if(matrix[i][j]>target) j--;
else if(matrix[i][j]<target) i++;
}
return false;
}
基本思路如下:
- 从右上角开始
- 如果当前值矩阵[i] [j]大于目标,则i--
- 如果当前值矩阵[i] [j]小于目标,那么j ++
beat 100%
class Solution {
public boolean searchMatrix(int[][] matrix, int target) {
// if(matrix == null || matrix[0] == null || matrix.length == 0 || matrix[0].length == 0){
// return false;
// }
if(matrix == null || matrix.length == 0 || matrix[0].length == 0) {
return false;
}
int xStart = 0;
int yStart = matrix.length - 1;
while( xStart <= matrix[0].length - 1 && yStart >= 0 ) {
if( target > matrix[yStart][xStart] ){
xStart++;
}else if( target < matrix[yStart][xStart]){
yStart--;
}else{
return true;
}
}
return false;
}
}