搜索二维矩阵II
题目
编写一个高效的算法来搜索 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)
链接:https://leetcode-cn.com/problems/search-a-2d-matrix-ii
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
思路
1.暴力法,直接双层遍历
2.基础二分.每行都是排序好的,此时可以利用每行的排序进行二分查找
3.复杂二分.行列都是排序好的,因此可以基于对角线进行二分处理.从右上角开始比较,如果当前值小于目标值,则说明整行都比目标值小,则目标数字不在该行中.如果当前值大于目标值,则说明整列都比目标值大,则目标数字不在该列中
代码
暴力法
class Solution {
public boolean searchMatrix(int[][] matrix, int target) {
//最简单的办法
for(int i = 0;i < matrix.length;i++){
for(int j = 0;j < matrix[i].length;j++){
if(target == matrix[i][j]){
return true;
}
}
}
return false;
}
}
基础二分
class Solution {
public boolean searchMatrix(int[][] matrix, int target) {
if(matrix.length == 0 || matrix[0].length == 0){
return false;
}
for(int i = 0;i < matrix.length;i++){
//如果最小值大于target,则直接跳出
if(matrix[i][0] > target){
break;
}
//如果最大值小于target,则说明改行没有,需要跳过
if(matrix[i][matrix[i].length-1] < target){
continue;
}
boolean result = binarySearch(matrix[i],target);
if(result){
return result;
}
}
return false;
}
public boolean binarySearch(int[] nums,int target){
int start = 0;
int end = nums.length-1;
while(start <= end){
int mid = (start + end) / 2;
if(nums[mid] == target){
return true;
}else if(nums[mid] < target){
start = mid + 1;
}else{
end = mid - 1;
}
}
return false;
}
}
复杂二分
class Solution {
public boolean searchMatrix(int[][] matrix, int target) {
if(matrix.length == 0 || matrix[0].length == 0){
return false;
}
int i = 0;
int j = matrix[i].length -1;
while(i < matrix.length && j >= 0){
int num = matrix[i][j];
if(num == target){
return true;
}if(num < target){
i++;
}else{
j--;
}
}
return false;
}
}