搜索二维矩阵 II
中等
编写一个高效的算法来搜索 m x n 矩阵 matrix 中的一个目标值 target 。该矩阵具有以下特性:
每行的元素从左到右升序排列。
每列的元素从上到下升序排列。
示例 1:
输入: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
示例 2:
输入: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 = 20
输出:false
题解:二分法查找(暴力破解:遍历二维矩阵比较元素值与目标值)
遍历二维矩阵,把单个数组作为参数传入方法进行二分查找
用left,right,分别记录数组左右边界下标,mid记录数组二分之后的下标。
循环遍历,如果left<=right说明数组二分还没遍历完,相等的情况就是数组最后一位元素了,如果target与mid下标对应值相等则返回其下标,如果大于,说明target出现在数组右边,对右半部分在进行二分查找,左边界值left=mid+1;如果小于,说明在左边,对左半部分进行二分查找,右边界right=mid-1;
如果都不满足返回-1
回到主方法,判断返回值是否大于等于0,满足说明找到目标值返回true,否则返回false。
class Solution {
public boolean searchMatrix(int[][] matrix, int target) {
for(int[] row : matrix){
int index = sort(row,target);
if(index >= 0){
System.out.println("true");
return true;
}
}
return false;
}
public static int sort(int[] arr,int target){
int left = 0;
int right = arr.length-1;
while (left<=right){
int mid = (left+right)/2;
if(target>arr[mid]){
left = mid+1;// 左边界
}else if(target<arr[mid]){
right = mid-1;// 有边界
}else {
return mid;
}
}
return -1;
}
}