剑指Offer👉问题01:查找特殊二维数组中的数
开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第1天,点击查看活动详情
问题描述:
在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
解题思路:
思路一:最简单最容易想到的办法就是暴力求解。如果真的笔试或者其他情况下碰到类似的问题,并且自己一时没有其他更好的思路的时候,求解问题答案就变成了第一目标,暴力求解也不是不可以用的。
思路二:推荐解法。由于二维数组存在上到下递增,左到右递增的特殊性。应该从矩阵的右上角或者左下角开始查找。 以右上角为例,首先选取右上角的数字,如果该数字等于要查找的数字,则查找过程结束; 如果该数字大于要查找的数字,则说明该列其他元素都大于要查找的数字,便可以删掉该列; 如果该数字小于要查找的数字,则说明该行其他元素也都小于要查找的数字,便可以删掉该行。这样,每一次比较都可以剔除一行或者一列,进而缩小查找范围,时间复杂度为 O(n)。
示例:
查找特殊二维数组中的数字7:
求解:
方法一:暴力求解
public static boolean findNumber(int[][] tempArray, int target) {
for (int i = 0; i < tempArray.length; i++) {
for (int j = 0; j < tempArray[i].length; j++) {
if (tempArray[i][j] == target){
System.out.println("目标值位置为:(" + (i+1) + ", " + (j+1) + ")");
return true;
}
}
}
return false;
}
方法二:推荐
public static boolean findNumberIn2DArray(int[][] tempArray, int target){
// 若数组为空,直接返回 false
if(tempArray == null || tempArray.length ==0){
return false;
}
// 数组不为空时,从二维数组的右上角开始查询(或者左下角)
for (int i = 0, j = tempArray[0].length-1; i < tempArray.length && j >= 0;){
if(tempArray[i][j] > target){ //当前位置值比目标值大时,左移
j--;
}else if (tempArray[i][j] < target){ //当前位置值比目标值小时,下移
i++;
}else {
System.out.println("目标值位置为:(" + (i+1) + ", " + (j+1) + ")");
return true;
}
}
return false;
}
完整代码
public static boolean findNumberIn2DArray(int[][] tempArray, int target){
// 若数组为空,直接返回 false
if(tempArray == null || tempArray.length ==0){
return false;
}
// 数组不为空时,从二维数组的右上角开始查询(或者左下角)
for (int i = 0, j = tempArray[0].length-1; i < tempArray.length && j >= 0;){
if(tempArray[i][j] > target){ //当前位置值比目标值大时,左移
j--;
}else if (tempArray[i][j] < target){ //当前位置值比目标值小时,下移
i++;
}else {
System.out.println("目标值位置为:(" + (i+1) + ", " + (j+1) + ")");
return true;
}
}
return false;
}
public static void main(String[] args) {
int[][] tempArray = {{1, 2, 8, 9}, {2, 4, 9, 12}, {4, 7, 10, 13}, {6, 8, 11, 15}};
int target = 7;
boolean result = findNumberIn2DArray(tempArray, target);
if (result){
System.out.println("找到了");
}else {
System.out.println("未查询到目标值");
}
}
结果展
代码设置的目标值为7,输出结果如图所示: