说明:
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/,直接跟着这位大神博客刷题的,部分思路参考大神。