题目描述
在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
思路分析:
三种方法
- 暴力枚举:直接遍历二维数组
- 对每行都进行二分查找
- 优雅一点,选定数组左下角或右上角,这里选定右上角。从右上角开始遍历,如果相等就找到了,不等则继续判断此时的数比要查找的数大还是小:如果 当前数比要寻找的数 大,则列数减小(向左移); 如果 当前数比要寻找的数 小,则行数增大(向下移动)。
代码
方法3:选定右上角开始遍历
/**
*
* @Description:
* 题目描述
* 在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,
* 每一列都按照从上到下递增的顺序排序。请完成一个函数,
* 输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
*/
public class Search {
public boolean Find(int target, int [][] array) {
//数组为空检验
if (array.length == 0 || array[0].length == 0){return false;}
//从右上角开始查找
for(int row = 0,col = array[0].length-1 ; row <array.length && col >= 0 ; ) {
System.out.println(row + " "+col);
if (array[row][col] == target)
{
//1.等于,找到了
return true;
}else if (array[row][col] > target ) {
//2.如果 当前数比要寻找的数 大,则列数减小(向左移)
col --;
}else if (array[row][col] < target) {
//3.如果 当前数比要寻找的数 小,则行数增大(向下移动)
row ++;
}
}
return false;
}
public static void main(String[] args) {
int[][] ints = new int[][]{{1,2,8,9},{2,4,9,12},{4,7,10,13},{6,8,11,15}};
boolean find = new Search().Find(6, ints);
System.out.println(find);
}
}
方法2:对每行都进行二分查找
public static void main(String[] args) {
int[][] ints = new int[][]{{1,2,8,9},{2,4,9,12},{4,7,10,13},{6,8,11,15}};
boolean find = new Search().search2(14, ints);
System.out.println(find);
}
boolean search2(int target, int [][] array) {
for (int i = 0; i <array.length ; i++) {
int[] ints = array[i];
//对每一行进行二分查找
int i1 = Arrays.binarySearch(ints, target);
if (i1 >= 0)
{
//找到了
return true;
}
}
return false;
}