行列已排序二维数组中的查找

题目:在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下的顺序排序。实现输入一个二维数组和一个整数,判断数组中是否含有该整数。

 

例如输入的二维数组是:

1  2  8   9

2  4  9   12

5  7  10 13

要查找的整数是 7 

 

分析:

(1) 最简单粗暴的方案是对二位数数组做遍历,这样算法的复杂度为O(n*m),但是计算量偏大,方案不可取。

(2) 考虑到二维数组中每一行及每一列都已排好序,可以从二维数组中的某一个位置开始取元素与查找对象进行比较。

  若从左上角开始取元素,我们会面临一个问题:取出的元素与查找元素比较完之后,只要它们不相等,则矩形中的该元素的右侧及下侧(或者左侧和上侧)的所有元素均

有可能等于要查找的元素,且会出现(行--列--行 )这种对行反复搜索的情况。类似的从右下角开始搜索也是这样。

    当我们选择从左下角或者右上角开始对矩阵进行搜索就可以简化流程,因为每次和待查找数字做比较的均是该行(右上角开始)最大值或者该列(左下角开始)最大值。

因此当缩小范围时,我们可以果断抛弃某一行或者某一列,从而实现列搜索完了后只需对行搜索--右上角(或者行搜索完后只需对列搜索--左下角)

 

Java 实现的代码如下:

 1 public boolean find(int[][]arr,int key){
 2     boolean found = false;
 3 
 4     final int rows = arr.length;        
 5     final int columns = arr[0].length;//这里假定二维数组是一个矩阵
 6     
 7     if(rows > 0 && columns >0){
 8         int row = 0;
 9         int column = columns - 1;
10         while(row < rows && column >= 0){
11             if(arr[row][column] == key){
12                 found = true;
13                 break;
14             }
15             else if(arr[row][column] > key)
16                 column-- ;
17             else 
18                 row++;
19         }
20         
21     }
22     return found;
23 }

 

posted on 2017-02-04 17:14  John_nok  阅读(466)  评论(0)    收藏  举报

导航