题目:在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
图中是m行n列,共m*n个元素的正方形。但是可能会存在数组长度不一致的情况。如下图:
解题思路:
1、暴力破解 (无需细说) 复杂度为O(m*n)
2、有序数组的思路。(多个有序数组查找)
k way merge 多个有序数组的合并
——常规 O(nk^2)
——最小
堆版本。维持一个大小为m的最
小堆,时间复杂度是O(n*mlgm)
堆排序可以认为是两个阶段。
(1)、构造有序堆阶段。 O(m) “heapify” phase 将数组放入堆顺序。
3 2 6 5 4 -> (_siftup_max(result, 1) )3 5 6 2 4 -> (siftup_max(result, 0)) 6 5 3 2 4
(2)、下沉排序阶段。“sortdown” phase 重复提取最大值和恢复堆顺序。 del O(lg m) 和 insert O(lg m)
总共m*n个数,所以最后是O(n*m lgm)
3、行列都是有序数组
从较大的有序的第一个元素开始比较。(左下、右上都可以)
以查找10为例子:复杂度为O(m+n)
代码网上很多。过两天初步看完剑指offer以后刷题的时候再分享。