剑指offer-面试题3.二维数组中的查找

题目:在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增

的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断该数组中是否有该整数。

 

算法流程如下:

比如一个二维数组array:

1 1 2 8 9
2 
3 2 4 9 12
4 
5 4 7 10 13
6 
7 6 8 11 15

 

1.这个二维数组的左上角是最小的数据,右下角为最大的数,

首先判断查找的数是否number<array[0][0]或number>array[1][1]

2.当number的大小在数组范围内再开始查找,找数组的右上角或者左下角开始

作为比较的基准,当选择左上角的时候,假设我们查找的为number=7

3.如果numbe<9,说明number比最后一列都小,再比较无意义

这时候数组为:

1 1 2 8
2 2 4 9 3 4 7 10 4 6 8 11

4.我们再取右上角的8作为基准,8大于7,再去掉最后一列

1 1 2
2 
3 2 4 
4 
5 4 7
6 
7 6 8

5.我们再取右上角的2作为基准,2<7那么,说明第一行再比较无意义,去掉第一行

1 2 4 
2 
3 4 7
4 
5 6 8

6.我们再把右上角的4作为基准,4<7那么,去掉第一行

1 4 7
2 
3 6 8

7.现在我们再比较右上角元素,7==7 恩 找到了。

 

 

这道题的解法如下:

 

 1 bool Find(int* matrix,int rows,int columns,int number)
 2 {
 3     int i,j;
 4 
 5     if(number>matrix[rows*columns-1]||number<matrix[0])
 6             return false;
 7    
 8     i=0;
 9     j=columns-1;
10 
11     
12     if(number==matrix[i*columns+j])
13             return true;
14 
15 
16     while(1)
17     {
18     
19         if(number>matrix[i*4+j])
20         {
21             i++;
22         }
23         if(number<matrix[i*4+j])
24         {
25             j--;
26         }
27 
28 
29         if(number==matrix[i*columns+j])
30             return true;
31         
32         if(j<0||i<0||i>3||j>3)
33             break;
34         
35         
36     }
37     return false;
38 }

 

 

几点注意:

1.查找的时候有的同学可能会问能不能不从右上角开始作为基准。

答案是肯定的,但是只能从右上角和左下角作为基准,为什么?

因为我们选择的基准必须在某个维度上是最大的在某个维度上是

最小的,不然我们就不能根据比较的结果决定是否去掉一行或者去掉一列

 

2.查找的结束条件是,当我们的右上角元素索引值只要有一个维度的索引值

不在二维数组的正常索引范围内就说明需要查找的元素不在这个数组中。

尤其是第一点,希望读者好好理解。

 

posted @ 2015-07-20 22:35  vpoet  阅读(223)  评论(0编辑  收藏  举报