我的LeetCode代码仓:https://github.com/617076674/LeetCode
原题链接:https://leetcode-cn.com/problems/search-a-2d-matrix-ii/description/
题目描述:
知识点:分治算法、二分查找法
思路一:暴力破解法
时间复杂度是O(m * n),其中m为矩形的行数,n为矩阵的列数。空间复杂度是O(1)。
JAVA代码:
public class Solution {
public boolean searchMatrix(int[][] matrix, int target) {
int m = matrix.length;
if (0 == m) {
return false;
}
int n = matrix[0].length;
if (0 == n) {
return false;
}
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
if (target == matrix[i][j]) {
return true;
}
}
}
return false;
}
}
LeetCode解题报告:
思路二:分治算法
思路一没有利用题目的条件——“每行的元素从左到右升序排列,每列的元素从上到下升序排列”。为了利用这一条件,我们从矩阵右上角开始遍历。(实际上,我们从矩阵的左下角开始遍历也是可以的。)
(1)如果目标值等于当前值,直接返回true。
(2)如果目标值小于当前值,说明当前列的元素均不满足,我们遍历下一列(即左侧一列)。
(3)如果目标值大于当前值,说明当前行的元素均不满足,我们遍历下一行。
时间复杂度是O(m + n),其中m为矩形的行数,n为矩阵的列数。空间复杂度是O(1)。
JAVA代码(从矩阵右上角开始遍历):
public class Solution {
public boolean searchMatrix(int[][] matrix, int target) {
int m = matrix.length;
if (0 == m) {
return false;
}
int n = matrix[0].length;
if (0 == n) {
return false;
}
int row = 0, col = n - 1;
while (row < m && col >= 0) {
if (target < matrix[row][col]) {
col--;
} else if (target > matrix[row][col]) {
row++;
} else {
return true;
}
}
return false;
}
}
JAVA代码(从矩阵左下角开始遍历):
public class Solution {
public boolean searchMatrix(int[][] matrix, int target) {
int m = matrix.length;
if (0 == m) {
return false;
}
int n = matrix[0].length;
if (0 == n) {
return false;
}
int row = m - 1, col = 0;
while (row >= 0 && col < n) {
if (target < matrix[row][col]) {
row--;
} else if (target > matrix[row][col]) {
col++;
} else {
return true;
}
}
return false;
}
}
LeetCode解题报告:
思路三:对每一行进行二分查找
时间复杂度是O(m * logn),其中m为矩形的行数,n为矩阵的列数。空间复杂度是O(1)。
JAVA代码:
public class Solution {
public boolean searchMatrix(int[][] matrix, int target) {
for (int i = 0; i < matrix.length; i++) {
if (true == binarySearch(matrix[i], target)) {
return true;
}
}
return false;
}
private boolean binarySearch(int[] array, int target) {
int left = 0, right = array.length - 1;
while (left <= right) {
int mid = left + (right - left) / 2;
if (target == array[mid]) {
return true;
} else if (target < array[mid]) {
right = mid - 1;
} else {
left = mid + 1;
}
}
return false;
}
}
LeetCode解题报告: