牛客网&剑指offer 二维数组中的查找(JAVA)
牛客网·剑指offer 二维数组中的查找(JAVA)
题目描述
在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
解题思路
解法一
将每一行看成一个一维数组,手写二分排序查他。
public class Solution {
private static int BS(int fromIndex, int toIndex, int[] a, int num) {
int low = fromIndex, high = toIndex-1;
while(low <= high) {
int mid = (low + high) / 2;
if(a[mid] < num)
low = mid + 1;
else if(a[mid] > num)
high = mid - 1;
else
return mid;
}
return -(low + 1);
}
public boolean Find(int target, int [][] array) {
if(array == null) return false;
boolean ans = false;
for(int i = 0; i < array.length; i++) {
if(array[i].length == 0 || array[i][0] > target) break; //万一此列为空
if(BS(0, array[i].length, array[i], target) < 0) continue;
else {
ans = true;
break;
}
}
return ans;
}
}
解法二
前提:矩阵是有序的。
从第i行看:
- 若该行的最后一个数字小于所查询数字, 那么肯定不可能在该行,直接去下一行查找。
- 若该行的最后一个数字等于所查询数字,那么返回true。
- 若该行的最后一个数字大于所查询数字,那么必在该行,搜索即可。
public class Solution {
public boolean Find(int [][] array,int target) {
boolean found = false;
int lie = array[0].length; // 列长
int hang = array.length; // 行数
int column = lie -1; // 从最后一列看起
int row =0; // 从第一行看起
while(row<hang &&column>=0){
int value = array[row][column];
if(target>value){
row++;
}else if(value>target){
column--;
}else{
found = true;
break;
}
}
return found;
}
}
解法3
解法二中引入快排
public class Solution {
private static int BS(int fromIndex, int toIndex, int[] a, int num) {
int low = fromIndex, high = toIndex-1;
while(low <= high) {
int mid = (low + high) / 2;
if(a[mid] < num)
low = mid + 1;
else if(a[mid] > num)
high = mid - 1;
else
return mid;
}
return -(low + 1);
}
public boolean Find(int target, int [][] array) {
boolean ans = false;
for(int i = 0; i < array.length; i++) {
if(array[i].length == 0) break;
int value = array[i][array[i].length-1];
if(value < target)
continue;
else if (value > target) {
if(BS(0, array[i].length, array[i], target) >= 0)
ans = true;
} else {
ans = true;
break;
}
}
return ans;
}
}