问题描述:
在一个2维有序数组(N*N)中查找一个值为K。 其数组的描述如下图:
其中:行递增序列,列也是递增序列。
解决方案:
1:刚开始想到了败者树来查找,发现有点大才小用。并且时间效率也不是很高,败者树主要是来做多路归并或是未排序的数组的一个查找过程。这样的时间复杂度也得O(N*logN);
2:老老实实一行一行地2分查找也就O(N*logN);
3:仔细观察这个数组后,我们可以这样处理,先对a[i][i]数组进行2分查找,存在返回其位置,不存在返回其最近的比K小的位置POS。此时仅需对图中标红的一行一列进行2分查找即可。其时间复杂度为O(logN);
总结:
本来是个很简单的题,非得要开始去想到什么败者树干什么?简单的方法去完成即可。