说明:
1.本系列是根据《》这个系列做的一个小笔记。
2.直接动力是因为师兄师姐找工作很难,而且机械出生的我面试算法更难。
3.刚开始准备刷LeetCode、LintCode,突然看见一个,同为研究僧为啥差别那么大呢?
4.在别人基础之上进行部分优化,总结自己的观点。
问题:
在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
思路:
1.普通想法:行列循环,依次寻找。
2.升级思想:以行和列为单位,以一行或者一列的最大一个数去和目标对比(等于目标直接结束、小于目标向下一行或列的最大值进行对比、大于目标值以此行或者列为目标进行查找),这些循环都是迭代的,当然也可以用循环。
3.终极思想:以第二个思想为基础,搜索目标改为二分法,这种方法平均效率很高。
4.~~能力有限欢迎补充!
C++代码实现:(本文以第二个为例子)
1 #include2 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,不存在返回False17 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
参考:,直接跟着这位大神博客刷题的,部分思路参考大神。