一、搜索二维矩阵II
240:编写一个高效的算法来搜索 m x n 矩阵 matrix 中的一个目标值 target 。该矩阵具有以下特性: 每行的元素从左到右升序排列。 每列的元素从上到下升序排列。
class Solution {
public boolean searchMatrix(int[][] matrix, int target) {
int m = matrix.length;
int n = matrix[0].length;
int x=0,y=n-1;
while(x<m&&y>=0){
if(matrix[x][y]==target){
return true;
}else if(matrix[x][y]>target){
y--;
}else{
x++;
}
}
return false;
}
}
二、有序矩阵第K小的元素
378:给你一个 n x n 矩阵 matrix ,其中每行和每列元素均按升序排序,找到矩阵中第 k 小的元素。请注意,它是 排序后 的第 k 小元素,而不是第 k 个 不同 的元素。
class Solution {
public int kthSmallest(int[][] matrix, int k) {
int low = matrix[0][0];
int high = matrix[matrix.length-1][matrix.length-1];
while(low<high){
//不能直接(low+high)/2,如果low和high都是负数会取整往大的取
int mid = low+(high-low)/2;
if(check(matrix,mid,k)){//小于等于mid的元素 大于等于k个
high = mid;
}else{//小于k个
low = mid+1;
}
}
return low;
}
//看矩阵中小于等于mid的元素个数是否大于等于k个
public boolean check(int[][] matrix,int mid,int k){
int m = matrix.length;
int x = m-1;
int y = 0;
int num = 0;
//从左下角往右上方扫描,保证与mid相等的全部算进去
while(x>=0&&y<m){
if(matrix[x][y]<=mid){
num += x+1;
y++;
}else{
x--;
}
}
return num>=k;
}
}