Toasobi
二维数组中的查找(中等)
本文最后更新于2023年03月02日,已超过676天没有更新。如果文章内容或图片资源失效,请留言反馈,我会及时处理,谢谢!
因为上面说的是每一行非递减往右排序,我做这题的思路是先定位到给定数x所处的几行列,再两个for循环查找,我管它为优化后的暴力法。
<div>
class Solution {
public boolean findNumberIn2DArray(int[][] matrix, int target) {
int row = matrix.length;
if(row == 0) return false;
int cow = matrix[0].length;
if(cow == 0) return false; //一定要注意这里的二维数组判空,这里我编译失败了好几次
//这里不判空,提交[]或者[[]]会编译错误
int[] line = new int[matrix.length];
for (int i=0;i<matrix.length;i++){
if (target >= matrix[i][0]){
line[i] = i;
}
}
for (int i=0;i<line.length;i++){
for (int j=0;j<matrix[0].length;j++){
if(matrix[i][j] == target){
return true;
}
}
}
return false;
}
}
</div>
当然这个说白了还是暴力,虽然测试的时候速度超过了100%
========================
- 方法二:二分查找法
<div>
class Solution {
public boolean findNumberIn2DArray(int[][] matrix, int target) {
for (int[] row : matrix) {
int index = search(row, target);
if (index >= 0) {
return true;
}
}
return false;
}
public int search(int[] nums, int target) {
int low = 0, high = nums.length - 1;
while (low <= high) {
int mid = (high - low) / 2 + low;
int num = nums[mid];
if (num == target) {
return mid;
} else if (num > target) {
high = mid - 1;
} else {
low = mid + 1;
}
}
return -1;
}
}
</div>
注意二分查找法的原理,定义两个指针,每次使用int mid = (high - low) / 2 + low进行折半,然后去到mid值,通过target和mid值大小判断选择是high指针移动还是low指针移动