编写一个高效的算法来搜索 m x n 矩阵 matrix 中的一个目标值 target。该矩阵具有以下特性:
- 每行的元素从左到右升序排列。
- 每列的元素从上到下升序排列。
示例:
现有矩阵 matrix 如下:
[
[1, 4, 7, 11, 15],
[2, 5, 8, 12, 19],
[3, 6, 9, 16, 22],
[10, 13, 14, 17, 24],
[18, 21, 23, 26, 30]
]
给定 target = 5
,返回 true
。
给定 target = 20
,返回 false
。
leetcode 74. 搜索二维矩阵(Search a 2D Matrix)
leetcode 378. 有序矩阵中第K小的元素(Kth Smallest Element in a Sorted Matrix)
用上面2题的方式也可以通过噢,优先队列,就是效率太低了,运行了1000ms,emmmm,所以下面提供其他优质的代码
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() {}
}
}
class Solution {
public boolean searchMatrix(int[][] matrix, int target) {
if(matrix==null || matrix.length==0 || matrix[0].length==0){//当为null、[]、[[]]返回false
return false;
}
int row=matrix.length;
int col=matrix[0].length;
if(target>matrix[row-1][col-1] || target<matrix[0][0]){//当target不在矩阵的范围内,返回false
return false;
}
int i=row-1;//由于列有序的特性,从矩阵的左下角开始判断
int j=0;
while(i>=0 && j<col){
if(matrix[i][j]==target){//如果相等 直接返回
return true;
}else if(matrix[i][j]>target){//如果当前元素大于target那么说明当前值大于target,所以往上挪往小的元素搜索
i--;
}else{//如果当前元素小于target时,往右边挪,往大元素地方挪
j++;
}
}
return false;
}
}
public class Solution {
public boolean searchMatrix(int[][] matrix, int target) {
if(matrix == null || matrix.length < 1 || matrix[0].length <1) {
return false;
}
int xStart = 0;
int yStart = matrix.length-1;
while(xStart <= matrix[0].length-1 && yStart >= 0) {
if(target == matrix[yStart][xStart]) {
return true;
} else if(target < matrix[yStart][xStart]) {
yStart--;
} else if(target > matrix[yStart][xStart]) {
xStart++;
}
}
return false;
}
}