牛客网面试必刷:BM18 二维数组中的查找
- 前言
- 一、解法1:逐行使用二分搜索
- 二、解法2:线性搜索(推荐)
前言
二分查找常见的是在一维数据中进行,在我的上一篇文章中已经有介绍。
一维数组查找:BM18 二维数组中的查找
本文介绍的是在二维数组中查找某个数字,有些解法可以参考在一维数组中二分查找,有些解法则是全新的思路
常见题目为:
在一个二维数组array中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
[
[1,2,8,9],
[2,4,9,12],
[4,7,10,13],
[6,8,11,15]
]
给定 target = 7,返回 true。
给定 target = 3,返回 false。
一、解法1:逐行使用二分搜索
解题思路: 利用数组每行每列都是递增特性。
这种思路比较简单易懂,从第一行开始,每行依次进行二分搜索,找到答案就返回 true,每一行都找不到就返回 false 。
public class Solution {
public boolean Find(int target, int [][] array) {
int i,j=0;
for(i = 0; i < array.length ;i++){
if(binary_search(target,array[i])) return true;
}
return false;
}
public boolean binary_search(int target,int[] arr){
int left = 0;
int right = arr.length - 1;
while(left <= right){
int mid = (right - left)/2 +left ;
if(arr[mid] > target){
right = mid - 1;
}else if(arr[mid] < target){
left = mid + 1;
}else{
return true;
}
}
return false;
}
}
时间复杂度:
二、解法2:线性搜索(推荐)
解题思路: 利用二维数组行列递增特性
-
由于行列递增,可以得出:
- a.在一列中的某个数字,其上的数字都比它小
- b.在一行中的某个数字,其右的数字都比它大 搜索流程:
- a.首先从数组左下角搜索.
- b.如果当前数字大于target,那么查找往上移一位,如果当前数字小于target,那么查找往右移一位。
- c.查找到target,返回true; 如果越界,返回false;
public class Solution {
public boolean Find(int target, int [][] array) {
if(array.length == 0){
return false;
}
int l = array.length; //行数
int r = array[0].length;//列数
int i = l - 1;//定位所在行
int j = 0;//定位所在列
while(j < r && i>= 0){//要保证array[i][j]在数组中,不出现索引越界
if(array[i][j] == target) return true;
else if(array[i][j] > target) i--;
else j++;
}
return false;
}
}
时间复杂度: