剑指offer之面试题3:二维数组中的查找

来源:互联网 发布:the ludlows 知乎 编辑:程序博客网 时间:2024/06/02 09:00

题  目:

在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。


解题思路:

由于二维数组元素的值是有规律的,从左到右(从上到下)是按照值递增的顺序排列的,故不应该对整个数组进行盲目(双层循环解决)搜索查找。在查找所查找的值number是否存在于二维数组,我们从“右上角” 开始“左下角” 方向扫描查找,先将查找的起始行定位于第一行(row=0),将查找的起始列定位于最后一列(col = cols -1),然后比较当前元素值与number的大小关系:

若number == 当前元素值a[row][col],查找成功,并记录下当前元素的行列下标;

若number >当前元素值a[row][col],则排除该数所在的列,则向左(值减小的方向)扫描,col--;

number < 当前元素值a[row][col],则排除该数所在的行,则向下(值增大的方向)扫描,row++


同样,在查找的时候同样可以从“左下角” 开始 “右上角” 方向扫描查找,先将查找的起始行定位于最后一行(row=rows-1),将查找的起始列定位于第一列(col = 0),然后比较当前元素值与number的大小关系:

若number == 当前元素值a[row][col],查找成功,并记录下当前元素的行列下标;

若number >当前元素值a[row][col],则排除该数所在的行,则向上(值减小的方向)扫描,row--;

number <当前元素值a[row][col],则排除该数所在的列,则向右(值增大的方向)扫描,col++


代码如下:

import java.util.Scanner;public class FindNumberInArray {public static int r;public static int c;public static int R = 4;public static int C = 5;//private static int[][] Array = new int[R][C];//test arrayprivate static int[][] Array = new int[][] { {1,2,3,5,6},{7,8,9,11,17},{18,24,36,38,39},{45,47,48,59,100}};public static void main(String[] args) {Scanner sc = new Scanner(System.in);//输入数组/*for(int i=0;i<R;i++){for(int j=0;j<C;j++){Array[i][j] = sc.nextInt();}}*/int number = sc.nextInt();boolean find = FindNumber(Array, R, C, number);if(find){System.out.println("The number is "+ number +".\nArray["+ r +"]["+ c + "] is the right location!");}else{System.out.println("Not Find!");}}public static boolean FindNumber(int[][] a,int rows,int cols,int number ){boolean find = false;if(a!=null && rows >0 && cols >= 0){int row = 0;    //定位到第一行int col = cols -1;  //定位到最后一列while (row < rows && col >= 0) {if(a[row][col] == number){find = true;  //找到当前值,退出循环r = row;  //保存当前行位置c = col;  //保存当前列位置break;}else if(a[row][col] > number){col--;  //当前列的值较大,则向左(值减小的方向)扫描,col--;}else{row++;  //当前行的值较小,则向下(值增大的方向)扫描,row++;}}}return find;}}

输入:

24

输出结果:

The number is 24.
Array[2][1] is the right location!


输入:

46

输出结果:

46
Not Find!


0 0
原创粉丝点击