240. 搜索二维矩阵 II
编写一个高效的算法来搜索 m x n 矩阵 matrix 中的一个目标值 target 。该矩阵具有以下特性:
每行的元素从左到右升序排列。
每列的元素从上到下升序排列。
该题目解法大概分为3种
1、普通暴力搜索
2、利用数组排序特性:利用二分法和区域分割确定值
class Solution {
public boolean searchMatrix(int[][] matrix, int target) {
if (matrix == null || matrix.length == 0 || matrix[0].length == 0) {
return false;
}
int [][] inputMatrix = matrix;
int inputTarget = target;
if (matrix[0].length == 1 && matrix.length == 1 )return target == matrix[0][0];
return search(inputMatrix, inputTarget, 0,matrix[0].length - 1, 0, matrix.length - 1);
}
private boolean search(int[][] inputMatrix, int inputTarget, int left, int right, int up, int down) {
if (left > right || up > down || inputTarget < inputMatrix[up][left] || inputTarget > inputMatrix[down][right]) return false;
int mid_y = up + (down - up) / 2;
int mid_x = binarySearch(inputMatrix[mid_y], left, right,inputTarget);
if (mid_x == -2) return true;
return search(inputMatrix, inputTarget, left,mid_x, mid_y + 1, down)
||search(inputMatrix, inputTarget, mid_x + 1,right, up, mid_y);
}
private int binarySearch(int[] arr, int left, int right,int target) {
int mid = 0;
while (left <= right){
mid = (left + right) / 2;
if (arr[mid] == target) return -2;
else if (target < arr[mid]){
right = mid - 1;
}else{
left = mid + 1;
}
}
return right;
}
}
3:巧解: 从右上角或左下角开始锁定
class Solution {
public boolean searchMatrix(int[][] matrix, int target) {
// start our "pointer" in the bottom-left
int row = matrix.length-1;
int col = 0;
while (row >= 0 && col < matrix[0].length) {
if (matrix[row][col] > target) {
row--;
} else if (matrix[row][col] < target) {
col++;
} else { // found it
return true;
}
}
return false;
}
}

浙公网安备 33010602011771号