【算法日记-搜索二维矩阵】
二分查找第一题 冲…
先看题目:编写一个高效的算法来判断 m x n 矩阵中,是否存在一个目标值。该矩阵具有如下特性:
- 每行中的整数从左到右按升序排列。
- 每行的第一个整数大于前一行的最后一个整数。
例:
输入:matrix = [[1,3,5,7],[10,11,16,20],[23,30,34,60]], target = 3
输出:true
我的解法:
public boolean searchMatrix(int[][] matrix, int target) {
if(matrix == null || matrix.length == 0 ||matrix[0].length == 0) return false;
int left = 0,right = matrix[0].length-1;
while(left<matrix.length && right >= 0){
if(matrix[left][right] == target){
return true;
}else if(matrix[left][right] > target){
right--;
}else{
left++;
}
}
return false;
}
二维数组的二分查找对我来说有点绕,还是我的解法比较易懂吧·
但二分查找是必备技能,难也得学是吧!
看看题解的二分查找吧
选取虚数组最中间的序号作为中间序号: pivot_idx = (left + right) / 2。
该序号对应于原矩阵中的 row = pivot_idx / n 行 col = pivot_idx % n 列, 由此可以拿到中间元素pivot_element。该元素将虚数组分为两部分。
比较 pivot_element 与 target 以确定在哪一部分进行进一步查找。
public boolean searchMatrix(int[][] matrix, int target) {
int m = matrix.length;
if (m == 0) return false;
int n = matrix[0].length;
// 二分查找
int left = 0, right = m * n - 1;
int pivotIdx, pivotElement;
while (left <= right) {
pivotIdx = (left + right) / 2;
pivotElement = matrix[pivotIdx / n][pivotIdx % n];
if (target == pivotElement) return true;
else {
if (target < pivotElement) right = pivotIdx - 1;
else left = pivotIdx + 1;
}
}
return false;
}