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

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


本文通过对重要条件:

每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序”的理解逐步进行优化。


1.暴力搜索

不考虑两个递增的特性,直接对该二维数组进行行列搜索。

时间复杂度取决于数组的大小,O(n²)

代码两层for循环即可。

2.二分简单优化

只利用行有序的条件,对行进行二分查找。

可将时间复杂度降低到O(nlogn)

代码在第一种情况下将内层for循环改成二分查找即可。

3.从右上角或者左下角(对书中解法的理解)

我最开始的想法就是从左上角开始进行一种,类似于dfs的解法。

很明显,看过书中解法之后,远没有书中的解法来的巧妙。

扫描二维码关注公众号,回复: 9504098 查看本文章

可以通过生活中做数独的例子,去理解书中的解法。

0)从右上角开始,将当前数字temp同待查询数字x比较。

​ 0.1)如果x == temp 找到该数字结束

​ 0.2)如果x > temp,已知temp为该行最大数字,故排除整行,将temp设为该列第二个数字,回到0

​ 0.3)如果x < temp,已知temp为该列最小数字,故排除整列,将temp设为刚行第二个数字(倒数第二个),回到0

这个思路是通过深刻理解题意,巧妙的利用题目的条件解出来的。时间复杂度降低到了O(n)

猜你喜欢

转载自www.cnblogs.com/Justdocument/p/12388669.html