一、题目
力扣原题:https://leetcode-cn.com/problems/search-a-2d-matrix-ii/
二、暴力
class Solution {
public boolean searchMatrix(int[][] matrix, int target) {
if (null == matrix || 0 == matrix.length || 0 == matrix[0].length) {
return false;
}
int row = matrix.length;
int col = matrix[0].length;
for (int i = 0; i < row; i++) {
for (int j = 0; j < col; j++) {
if (matrix[i][j] == target) {
return true;
}
}
}
return false;
}
}
- 时间复杂度:O(n^2)
- 空间复杂度:O(1)
三、逐行二分
class Solution {
public boolean searchMatrix(int[][] matrix, int target) {
if (null == matrix) {
return false;
}
for (int i = 0; i < matrix.length; i++) {
int index = Arrays.binarySearch(matrix[i], target);
if (index >= 0) {
return true;
}
}
return false;
}
}
- 基本思路:由于每行、每列都是递增排列,因此可以采用逐行二分查找的方法。局限是没有用到列的有序性。
- 时间复杂度:O(mlog(n))。每行的二分查找性能是log(n),m行为O(mlog(n))
- 空间复杂度:O(1)
四、模拟法
class Solution {
public boolean searchMatrix(int[][] matrix, int target) {
if (null == matrix || 0 == matrix.length || 0 == matrix[0].length) {
return false;
}
int row = matrix.length;
int col = matrix[0].length;
// 记录坐标
int x = 0;
int y = col - 1;
while (x < row && y >= 0) {
// 往下
if (matrix[x][y] < target) {
x++;
}
// 往左
else if (matrix[x][y] > target) {
y--;
}
else if (matrix[x][y] == target) {
return true;
}
}
return false;
}
}
- 基本思路:从第一行最后一列开始,往下、往左搜索。
- 时间复杂度:O(m + n)
- 空间复杂度:O(1)
五、总结
充分利用有序性条件