影醉阏轩窗

衣带渐宽终不悔,为伊消得人憔悴。
扩大
缩小

剑指offer(一):二维数组中的查找

说明:

  1.本系列是根据《剑指Offer》这个系列做的一个小笔记。

  2.直接动力是因为师兄师姐找工作很难,而且机械出生的我面试算法更难。

  3.刚开始准备刷LeetCode、LintCode,突然看见一个大神博客,同为研究僧为啥差别那么大呢?

  4.在别人基础之上进行部分优化,总结自己的观点。

 


问题:

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

思路:

  1.普通想法:行列循环,依次寻找。

  2.升级思想:以行和列为单位,以一行或者一列的最大一个数去和目标对比(等于目标直接结束、小于目标向下一行或列的最大值进行对比、大于目标值以此行或者列为目标进行查找),这些循环都是迭代的,当然也可以用循环。

  3.终极思想:以第二个思想为基础,搜索目标改为二分法,这种方法平均效率很高。

  4.~~能力有限欢迎补充!

C++代码实现:(本文以第二个为例子)

 1 #include<iostream>
 2 using namespace std;
 3 bool FindNum(int* num, int aim);
 4 
 5 int main()
 6 {
 7     cout << "The first code Answer is : ";
 8     int a[5][5] = { {1,2,3,4,5},{2,3,4,5,6 }, {11, 12, 13, 14, 15},{21, 22, 23, 24, 25},{31, 32, 33, 34, 35} };
 9     cout << FindNum(a[0],7) << endl;
10     while (1);
11     return 0;
12 }
13 
14 //@num:二维数组
15 //@aim:目标数
16 //@存在返回True,不存在返回False
17 bool FindNum(int* num, int aim)
18 {
19     if (num == NULL) return false;
20     int rows = sizeof(num) / sizeof(num[0]);
21     int cols = sizeof(num[0]);
22     for (int i = cols - 1; i >= 0; i--)
23     {
24         if (*(num + 0*cols +i) == aim) return true;//相等退出
25         else if (*(num + 0 * cols + i)>aim) continue;//大于删除列
26         else//小于查找列
27         {
28             for (int j = 0; j<cols; j++)
29             {
30                 if (*(num + j * cols + i) == aim) return true;
31                 else continue;
32             }
33             return false;
34         }
35     }
36     return false;
37 }

 

 

 

参考:http://cuijiahua.com/,直接跟着这位大神博客刷题的,部分思路参考大神。

 

posted on 2017-12-19 10:38  影醉阏轩窗  阅读(243)  评论(2编辑  收藏  举报

导航

/* 线条鼠标集合 */ /* 鼠标点击求赞文字特效 */ //带头像评论