题目链接
牛客:二维数组中的查找
LeetCode:剑指 Offer 04. 二维数组中的查找
思路
从右上角开始找起,如果 target 比当前值小表示 target 在当前值的左边,如果比当前值大,表示在下面,按这个规则依次寻找。时间复杂度是 O(m+n)。
代码
牛客:
public class Solution {
public boolean Find(int target, int[][] array) {
int row = array.length;
int col = array[0].length;
int i = 0, j = col - 1; //开始从右上角找起
while (i < row && j >= 0) {
if (target == array[i][j]) {
return true;
} else if (target < array[i][j]) { //如果目标值比当前小 肯定在当前值的左边
j--;
} else { //如果目标值比当前大 肯定在当前值的右边
i++;
}
}
return false;
}
}
LeetCode:
class Solution {
public boolean findNumberIn2DArray(int[][] matrix, int target) {
if (matrix.length == 0) {
return false;
}
int row = matrix.length;
int col = matrix[0].length;
int i = 0;
int j = col - 1;
while (i < row && j >= 0) {
if (target > matrix[i][j]) {
i++;
} else if (target < matrix[i][j]) {
j--;
} else {
return true;
}
}
return false;
}
}
相似题
补充题:74. 搜索二维矩阵
思路:二分查找在二维数组中的应用
class Solution {
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;
}
}