百度HR算法设计题
1.给定如下的n*n的数字矩阵,每行从左到右是严格递增, 每列的数据也是严格递增1 2 3
3 5 6
4 8 9
现在要求设计一个算法, 给定一个数k 判断出k是否在这个矩阵中。 描述算法并且给出时间复杂度(不考虑载入矩阵的消耗) 题目应该很简单,我自己做的,不知道是不是log(n)*long(n) 本帖最后由 qianyb 于 2010-6-1 12:29 编辑
先用二分查找到小于k的最大行,再用二分法查找,复杂度应该是2log_2n 我是按对角线进行二分查找,找出k所在的行或列m,然后分别对这个m行和m列余下的部分再进行二分查找,所以平均复杂度应该是O(logn*logn), 按你的方法,平均复杂度也是$2log_2n$,不过你的方法在编程上处理时比我的方法复杂 3# qianyb
最大行怎么找出来的? 复杂度应该是O(n)的,就是一个杨氏矩阵的问题。2log2n做不到 本帖最后由 qianyb 于 2010-6-2 14:28 编辑
我题目理解错了,以为下一行的数据都比上一行大。就算上一行有的数据比下一行大,但复杂度还是log_2n不过代码的控制复杂了些
算法思路是
先从(1,1)开始按对角线查找小于k的最大行和大于k的最小行,即(x,x)>k,(x+1,x+1)<k,这是k可能的范围是矩形(x+1,1),(n,x)和矩形(1,x+1),(x,n)范围内,在这两个范围内再次以对角线方式进行查找小于k的最大行和大于k的最小行,最后缩小到每个矩形为1时结束 如果只简单的判断矩形中间元素,那么复杂度应该是$n*lg(n)$吧。
To litaoye:O(n)的法子是什么? 是查找元素k在不在矩阵中