题目:在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
本文通过对重要条件:
“每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序”的理解逐步进行优化。
1.暴力搜索
不考虑两个递增的特性,直接对该二维数组进行行列搜索。
时间复杂度取决于数组的大小,O(n²)
代码两层for循环即可。
2.二分简单优化
只利用行有序的条件,对行进行二分查找。
可将时间复杂度降低到O(nlogn)
代码在第一种情况下将内层for循环改成二分查找即可。
3.从右上角或者左下角(对书中解法的理解)
我最开始的想法就是从左上角开始进行一种,类似于dfs的解法。
很明显,看过书中解法之后,远没有书中的解法来的巧妙。
可以通过生活中做数独的例子,去理解书中的解法。
0)从右上角开始,将当前数字temp同待查询数字x比较。
0.1)如果x == temp 找到该数字结束
0.2)如果x > temp,已知temp为该行最大数字,故排除整行,将temp设为该列第二个数字,回到0
0.3)如果x < temp,已知temp为该列最小数字,故排除整列,将temp设为刚行第二个数字(倒数第二个),回到0
这个思路是通过深刻理解题意,巧妙的利用题目的条件解出来的。时间复杂度降低到了O(n)