搜索二维矩阵
https://leetcode-cn.com/problems/search-a-2d-matrix/
思路1: 暴力查找
package com.shangguigu.dachang.algrithm.A02_binary;
/**
* @author : 不二
* @date : 2021/12/21-下午9:03
* @desc :
*
**/
public class A24_searchMatrix {
public static void main(String[] args) {
int[][] matrix = {
{1,3,5,7},
{10,11,16,20},
{23,30,34,60}};
boolean result = searchMatrix(matrix, 3);
System.out.println(" 结果是: " + result);
}
public static boolean searchMatrix(int[][] matrix, int target) {
boolean result = false;
// 两种解题思路:
// 1, 暴力破解,直接遍历;
// 当然暴力破解也可以:先判断是否在本行,如果在,则使用本行二分查找算法计算也行
for(int i=0;i<matrix.length;i++){
for(int j=0;j<matrix[i].length;j++){
if(target == matrix[i][j]){
result = true;
}
}
}
return result;
}
}
思路2: 把矩阵转换成一维数组进行二分查找
package com.shangguigu.dachang.algrithm.A02_binary;
/**
* @author : 不二
* @date : 2021/12/21-下午9:03
* @desc :
*
**/
public class A24_searchMatrix {
public static void main(String[] args) {
int[][] matrix = {
{1,3,5,7},
{10,11,16,20},
{23,30,34,60}};
boolean result = searchMatrix(matrix, 3);
System.out.println(" 结果是: " + result);
}
public static boolean searchMatrix(int[][] matrix, int target) {
boolean result = false;
// 两种解题思路:
// 1, 暴力破解,直接遍历;
// 当然暴力破解也可以:先判断是否在本行,如果在,则使用本行二分查找算法计算也行
/* for(int i=0;i<matrix.length;i++){
for(int j=0;j<matrix[i].length;j++){
if(target == matrix[i][j]){
result = true;
}
}
} */
// 2,虽然是一个矩阵,但是我们可以看作是一个数组
// 矩阵中:m为行,n为列
// 数组:长度:m*n, 然后matrix[i][j]在数组中的坐标为:i*n + j。i最大是m-1,j最大是n。最后:(m-1)n + n = mn
// 既然可以看成一个数组,我们就可以使用二分查找法:时间复杂度O(log2n)
int m = matrix.length;
if(m == 0){return false;};
int n = matrix[0].length;
int start = 0;
int end = m*n-1;
while(start <= end){
int mid = (start+end)/2;
System.out.println("------" + mid);
int rowNum = mid/n;
int columnNum = mid % n;
int theNum = matrix[rowNum][columnNum];
if(target == theNum){
result = true;
return result;
} else if(target > theNum){
start = mid + 1;
} else if(target < theNum){
end = mid -1;
}
}
return result;
}
}