二维数组中的查找Java实现[剑指offer]
题目
在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
1以矩形来查找
1.1描述
将二维数组画成矩形,然后从数组中选取一个数字,分3中情况来分析查找的过程,时间复杂度o(n*m),空间复杂度o(1)
1.2code
1 public class ArrayFind { 2 private static int[][] A; 3 4 private static int[][] initArray() { 5 int[][] A = { { 1, 2, 8, 9 }, { 2, 4, 9, 12 }, { 4, 7, 10, 13 }, 6 { 6, 8, 11, 15 } }; 7 return A; 8 } 9 10 private static void find(int target) { 11 boolean found=false; 12 if (A != null) { 13 int row =0; 14 int column = A[0].length-1; 15 int key; 16 while (row < A.length && column >= 0) { 17 key = A[row][column]; 18 System.out.println("now key="+key); 19 if (key == target) { 20 found=true; 21 break; 22 } else if (key < target) { 23 ++row; 24 } else { 25 --column; 26 } 27 } 28 if(found){ 29 System.out.println("find the targe "+target+" in :" + row + "," 30 + column + "!"); 31 } 32 else{ 33 System.out.println("Sorry not found!"); 34 } 35 } 36 37 } 38 39 public static void main(String[] args) { 40 // TODO Auto-generated method stub 41 A=initArray(); 42 find(14); 43 44 45 } 46 47 } 48 49 ———————————————— 50 版权声明:本文为CSDN博主「暮光_」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。 51 原文链接:https://blog.csdn.net/u012091092/article/details/45849445
2寻找普遍规律
2.1描述
从最后一列开始往回查找,每一列的第一行是该列的最小值,若目标值小于该列第一行,则其小于这一列的所有数字;找到大于等于目标值的该列数并记录col;
从第一行的第col列开始每行查找,每行的第col列是当前行的最大值,找到目标值小于等于第col列的数,记录下行数row;
在row~array.length行和0~col列之间的进行查找对应值即可;时间复杂度是o(n+m),空间复杂度是o(1)
2.2code
1 public boolean Find(int target, int [][] array) { 2 //0.判空 3 if(array==null||array.length==0||array[0].length==0){ 4 return false; 5 } 6 //1.先按照列进行判断,将target与第一行每一列的元素进行比较 7 //第一行每一列的元素是每一列最小的 8 int col=0; 9 for(int i=array[0].length-1;i>=0;i--){ 10 if(target>=array[1][i]){ 11 col=i; 12 break; 13 } 14 } 15 //2.按照行进行判断,将target与第col列每一行进行比较 16 //第col列每一行是该行最大的 17 int row=0; 18 for(int i=0;i<array.length;i++){ 19 if(target>=array[col][i]){ 20 row=i; 21 break; 22 } 23 } 24 //3.target就处于0~col和row到array.length之间 25 for(int i=row;i<array.length;i++){ 26 for (int j=0;j<=col;j++){ 27 if(array[i][j]==target){ 28 return true; 29 } 30 } 31 } 32 return false; 33 }