由买买提看人间百态

boards

本页内容为未名空间相应帖子的节选和存档,一周内的贴子最多显示50字,超过一周显示500字 访问原贴
JobHunting版 - T家一题
相关主题
变形面试问题G家onsite面经(感谢放水的国人大哥)
LinkedIn面试题请教请教一道Google面试题
找2个sorted array中的第K小的元素,有O(lgn)方法吗?二维排序数组的查找正解是O(M+N)的复杂度吗
EA 面筋面facebook都得一提多解吗?
F家一题请问可以用二分法判断一个数组是否sorted吗?
问G家一题问一个quick sort partition的问题, 二爷请进
问一个算法问题 微软面世经过
问一下sorting也问一个median的问题
相关话题的讨论汇总
话题: 元素话题: log话题: 复杂度话题: matrix话题: length
进入JobHunting版参与讨论
1 (共1页)
f*********m
发帖数: 726
1
Given a matrix with all elements sorted on each individual row and column
find the K-th smallest one.
我能想到的:
Merge sort N个或者M个sorted arrays,(M和N为matrix大小),直到merge结果包括K
个元素,复杂度为K*min(M, N)。
但好像没有很好利用行、列都sort这个性质,大家有何更好的方法?
c*****a
发帖数: 808
2
只想到heap。。。这解法不好.
r****m
发帖数: 70
3
类似二分法
i = m/2
j = n/2
while (i> 0 && j > 0 && i < m-1 && j < n-1) {
if (k > i*j && k < (i+1)*(j+1)) {
mergeSearch(matrix[i][0...j], matrix[0...i][j], k - (i*j));
} else if (k < i * j) {
i = i/2;
j = j/2;
} else {
i = (i+m)/2;
j = (j+n)/2;
}
}
l*****a
发帖数: 14598
4
去学习一下杨氏矩阵

K

【在 f*********m 的大作中提到】
: Given a matrix with all elements sorted on each individual row and column
: find the K-th smallest one.
: 我能想到的:
: Merge sort N个或者M个sorted arrays,(M和N为matrix大小),直到merge结果包括K
: 个元素,复杂度为K*min(M, N)。
: 但好像没有很好利用行、列都sort这个性质,大家有何更好的方法?

f*********m
发帖数: 726
5
学习了,多谢:)

【在 l*****a 的大作中提到】
: 去学习一下杨氏矩阵
:
: K

n*******w
发帖数: 687
6
Searching a 2D Sorted Matrix
http://www.leetcode.com/2010/10/searching-2d-sorted-matrix.html

K

【在 f*********m 的大作中提到】
: Given a matrix with all elements sorted on each individual row and column
: find the K-th smallest one.
: 我能想到的:
: Merge sort N个或者M个sorted arrays,(M和N为matrix大小),直到merge结果包括K
: 个元素,复杂度为K*min(M, N)。
: 但好像没有很好利用行、列都sort这个性质,大家有何更好的方法?

f*********m
发帖数: 726
7
这题和search可能还有差别。

【在 n*******w 的大作中提到】
: Searching a 2D Sorted Matrix
: http://www.leetcode.com/2010/10/searching-2d-sorted-matrix.html
:
: K

c*****a
发帖数: 808
8

区别很大....

【在 f*********m 的大作中提到】
: 这题和search可能还有差别。
A****e
发帖数: 310
9
搜到一个wwwyhx大牛的帖子:
http://www.1point3acres.com/bbs/thread-13146-1-1.html
p*****2
发帖数: 21240
10

哪里说了是杨氏矩阵?

【在 l*****a 的大作中提到】
: 去学习一下杨氏矩阵
:
: K

相关主题
问G家一题G家onsite面经(感谢放水的国人大哥)
问一个算法问题请教一道Google面试题
问一下sorting二维排序数组的查找正解是O(M+N)的复杂度吗
进入JobHunting版参与讨论
p*****2
发帖数: 21240
11

哪里说了是杨氏矩阵?

【在 l*****a 的大作中提到】
: 去学习一下杨氏矩阵
:
: K

l*****a
发帖数: 14598
12
Given a matrix with all elements sorted on each individual row and column
这个条件不是吗?

【在 p*****2 的大作中提到】
:
: 哪里说了是杨氏矩阵?

p*****2
发帖数: 21240
13

还真没看过。刚才以为是杨辉三角了。

【在 l*****a 的大作中提到】
: Given a matrix with all elements sorted on each individual row and column
: 这个条件不是吗?

l****o
发帖数: 43
14
re.
敢问wwwyhx大牛在这个版上么?

【在 A****e 的大作中提到】
: 搜到一个wwwyhx大牛的帖子:
: http://www.1point3acres.com/bbs/thread-13146-1-1.html

A****e
发帖数: 310
15
在呀,头像都是一样的。
他在别的帖子里也说过,这道题太难,可以不管

【在 l****o 的大作中提到】
: re.
: 敢问wwwyhx大牛在这个版上么?

a**********e
发帖数: 157
16
我的想法:
第一个一定是(1,1)
第二个是(1,2)或(2,1)
如果第二个是(1,2),那么第三个是(1,3),或(2,1)
K每增加1,只需要在”刚才try过的但没有被选用的元素以及刚选中元素的2个neighbor
中的一个“这
样一个集合寻找。
这样brute force的方法大约是O(k**2).如果heap应该是O(max(M,N)+K*lg(K))。
A****e
发帖数: 310
17
第三个为什么不能是(1,2)或(2,1)?

【在 a**********e 的大作中提到】
: 我的想法:
: 第一个一定是(1,1)
: 第二个是(1,2)或(2,1)
: 如果第二个是(1,2),那么第三个是(1,3),或(2,1)
: K每增加1,只需要在”刚才try过的但没有被选用的元素以及刚选中元素的2个neighbor
: 中的一个“这
: 样一个集合寻找。
: 这样brute force的方法大约是O(k**2).如果heap应该是O(max(M,N)+K*lg(K))。

d*********g
发帖数: 154
18

这个算法的复杂度不一定比用堆好吧?“给定任意一个数,有办法判断该元素是矩阵中
第几大的”,这一步应该是O(n),n是矩阵的max{长,宽},然后二分法找到恰好大于k
个数的数是O(lgm),其中m是矩阵中的最大值减最小值的大小。所以总复杂度是O(n*lgm
)。而用堆的复杂度是O(k*lgn)。不知道我的理解对么?

【在 A****e 的大作中提到】
: 搜到一个wwwyhx大牛的帖子:
: http://www.1point3acres.com/bbs/thread-13146-1-1.html

a**********e
发帖数: 157
19
粗心了。谢谢指出,已纠正。

【在 A****e 的大作中提到】
: 第三个为什么不能是(1,2)或(2,1)?
l****o
发帖数: 43
20
求教堆的解法

k
lgm

【在 d*********g 的大作中提到】
:
: 这个算法的复杂度不一定比用堆好吧?“给定任意一个数,有办法判断该元素是矩阵中
: 第几大的”,这一步应该是O(n),n是矩阵的max{长,宽},然后二分法找到恰好大于k
: 个数的数是O(lgm),其中m是矩阵中的最大值减最小值的大小。所以总复杂度是O(n*lgm
: )。而用堆的复杂度是O(k*lgn)。不知道我的理解对么?

相关主题
面facebook都得一提多解吗? 微软面世经过
请问可以用二分法判断一个数组是否sorted吗?也问一个median的问题
问一个quick sort partition的问题, 二爷请进找最大、第二大元素问题
进入JobHunting版参与讨论
d*********g
发帖数: 154
21
假设矩阵为L行H列,显然最小元素一定在第一行里(实际上就是
matrix[0][0])。那么把第一行的元素放到min_heap里,做成一个有H个元素的堆。容
易得到最小元素。
最小元素在第0列上,于是删掉堆里的最小元素,并且把第0列的下一个元素放进堆里。
原因是第二小的元素一定在第0列的下一个元素以及堆里之前的第一行剩下元素当中。
于是这样又在堆里得到了第二小的元素。假设这个元素是在第i列里。于是删掉这个堆
里的最小元素,并把第i列的下一个元素放到堆里,理由和上面类似。
这样的操作进行k次就行了。建堆的时间是O(H),k次插入堆的操作是O(k*lgH)。于是总
复杂度是O(H+k*lgH)。
求牛人看看这算法对不

【在 l****o 的大作中提到】
: 求教堆的解法
:
: k
: lgm

l****o
发帖数: 43
22
多谢。但我不太明白。
用第一行建完堆,然后用第一列的元素,从上到下依次插入堆吗?

【在 d*********g 的大作中提到】
: 假设矩阵为L行H列,显然最小元素一定在第一行里(实际上就是
: matrix[0][0])。那么把第一行的元素放到min_heap里,做成一个有H个元素的堆。容
: 易得到最小元素。
: 最小元素在第0列上,于是删掉堆里的最小元素,并且把第0列的下一个元素放进堆里。
: 原因是第二小的元素一定在第0列的下一个元素以及堆里之前的第一行剩下元素当中。
: 于是这样又在堆里得到了第二小的元素。假设这个元素是在第i列里。于是删掉这个堆
: 里的最小元素,并把第i列的下一个元素放到堆里,理由和上面类似。
: 这样的操作进行k次就行了。建堆的时间是O(H),k次插入堆的操作是O(k*lgH)。于是总
: 复杂度是O(H+k*lgH)。
: 求牛人看看这算法对不

d*********g
发帖数: 154
23

比如这么个矩阵:
1 4 8
2 6 10
5 7 11
首先把 1 4 8 放到堆里,然后发现第0列的元素1是最小的,于是把1拿出堆,把第0列
的下一个元素放到堆里,也就是2.
现在堆里有 2 4 8,然后发现第0列的元素2是最小的,接着把2拿出堆,把第0列的下一
个元素放到堆里,也就是5.
现在堆里有 5 4 8. 发现第1列的元素4是最小的,把4拿出堆,把第1列的下一个元素放
到堆里,也就是6.
现在堆里有5 6 8. 以此类推。

【在 l****o 的大作中提到】
: 多谢。但我不太明白。
: 用第一行建完堆,然后用第一列的元素,从上到下依次插入堆吗?

l****o
发帖数: 43
24
I am still not sure how this solution works. But I think your analysis of
the complexity might not be correct. For example, if k = 4, the correct
answer might be element [1][1] (index starting from 0). This solution will
go over the first column before checking [1][1] (?) Then the complexity in
this case is O(column length * \log(row length)).
On the other hand, this solution's worst case complexity is greater than O(
number of element/2), when k = median (?)

【在 d*********g 的大作中提到】
:
: 比如这么个矩阵:
: 1 4 8
: 2 6 10
: 5 7 11
: 首先把 1 4 8 放到堆里,然后发现第0列的元素1是最小的,于是把1拿出堆,把第0列
: 的下一个元素放到堆里,也就是2.
: 现在堆里有 2 4 8,然后发现第0列的元素2是最小的,接着把2拿出堆,把第0列的下一
: 个元素放到堆里,也就是5.
: 现在堆里有 5 4 8. 发现第1列的元素4是最小的,把4拿出堆,把第1列的下一个元素放

m***k
发帖数: 946
25
你的回复里感觉有几处不清楚和错误的地方。
1. “Then the complexity in this case is O(column length * \log(row length))“
假设ColumnLength=m, RowLength=n, 你说的复杂度就是m*log(n),这其实比堆解法的
复杂度k*log(n)快得多,因为k可以等于n*m/2. 堆解法的复杂度worst case是O(n*m*
log(n)).
2. "this solution's worst case complexity is greater than O(m*n/2)"
这不是很显然的么: O(k*log(n)) = O(n*m*log(n)) > O(M*n).
>>>总结一下:
1. 堆解法,复杂度是k*log(n), worst case (k=m*n/2, median)时,复杂度为O(m*n*
log(n))
2. 间接二分法,复杂度是O(n*log(max-min)). 具体方法是:
(1) 求一个整数x在矩阵中第几大,O(n)
(2) 在[a, b]范围的整数内,找出一个整数y,使其为第k+1大。这里二分a到b的范围
,需要O(log(b-a))步。每步需要调用(1),综合时间是 O(n*log(b-a)). 这里a是矩阵
的min,b是矩阵max.
(3) 找到y后,在矩阵中找小于y的元素中的最大值,时间O(n).
所以综合时间为O(n*log(max-min)). (1)和(2)具体怎么做,可以参考”搜索杨氏矩阵
“。

【在 l****o 的大作中提到】
: I am still not sure how this solution works. But I think your analysis of
: the complexity might not be correct. For example, if k = 4, the correct
: answer might be element [1][1] (index starting from 0). This solution will
: go over the first column before checking [1][1] (?) Then the complexity in
: this case is O(column length * \log(row length)).
: On the other hand, this solution's worst case complexity is greater than O(
: number of element/2), when k = median (?)

l****o
发帖数: 43
26
??我说的有错么?我一开始的意思就是说他之前的结论是有问题的阿,和你总结的是一
个意思啊.....

))“

【在 m***k 的大作中提到】
: 你的回复里感觉有几处不清楚和错误的地方。
: 1. “Then the complexity in this case is O(column length * \log(row length))“
: 假设ColumnLength=m, RowLength=n, 你说的复杂度就是m*log(n),这其实比堆解法的
: 复杂度k*log(n)快得多,因为k可以等于n*m/2. 堆解法的复杂度worst case是O(n*m*
: log(n)).
: 2. "this solution's worst case complexity is greater than O(m*n/2)"
: 这不是很显然的么: O(k*log(n)) = O(n*m*log(n)) > O(M*n).
: >>>总结一下:
: 1. 堆解法,复杂度是k*log(n), worst case (k=m*n/2, median)时,复杂度为O(m*n*
: log(n))

d*********g
发帖数: 154
27

首先,当k=4的时候,正确答案不应该是第[2][0]个元素么?还是说你的k是从0开始取
的?如果k从0开始取的,那k=4的时候正确答案是第[1][1]个元素。那么这个时候需要
做5次堆操作,也就是O((k+1)*log(row length))。为了方便,认为k是从1开始取的吧
,也就是说k=1时需要找最小的元素。这个时候取第k个元素的复杂度是O(k*log(row
length)).
你给的O(column length * \log(row length)) 没有一般性吧?取第k个元素与是否遍
历某一列没有必然联系。
当k是median的时候,自然复杂度就是O(mn/2 * log(row length))了,但是这不妨碍
O(k*log(row length)) 的正确性啊,因为这时k就等于 mn/2。所以说取得第k个元素
的复杂度是O(k*log(row length))没有问题吧?这个复杂度的逻辑其实很好想啊,要取
第k个元素,就要进行k次堆操作;每进行一次对操作就要log(row length)的时间。

【在 l****o 的大作中提到】
: I am still not sure how this solution works. But I think your analysis of
: the complexity might not be correct. For example, if k = 4, the correct
: answer might be element [1][1] (index starting from 0). This solution will
: go over the first column before checking [1][1] (?) Then the complexity in
: this case is O(column length * \log(row length)).
: On the other hand, this solution's worst case complexity is greater than O(
: number of element/2), when k = median (?)

l****o
发帖数: 43
28
嗯,median只是想说明有些情况堆解法不好用,不同的k可能有不同的better solution
不过我还是没懂这个算法,你方便写一下伪代码么?多谢~

【在 d*********g 的大作中提到】
:
: 首先,当k=4的时候,正确答案不应该是第[2][0]个元素么?还是说你的k是从0开始取
: 的?如果k从0开始取的,那k=4的时候正确答案是第[1][1]个元素。那么这个时候需要
: 做5次堆操作,也就是O((k+1)*log(row length))。为了方便,认为k是从1开始取的吧
: ,也就是说k=1时需要找最小的元素。这个时候取第k个元素的复杂度是O(k*log(row
: length)).
: 你给的O(column length * \log(row length)) 没有一般性吧?取第k个元素与是否遍
: 历某一列没有必然联系。
: 当k是median的时候,自然复杂度就是O(mn/2 * log(row length))了,但是这不妨碍
: O(k*log(row length)) 的正确性啊,因为这时k就等于 mn/2。所以说取得第k个元素

1 (共1页)
进入JobHunting版参与讨论
相关主题
也问一个median的问题F家一题
找最大、第二大元素问题问G家一题
请问一道题--给一个正方形矩阵,每个元素要么黑色要么白色,请找出最大的纯色子矩阵问一个算法问题
请教一个矩阵算法问题问一下sorting
变形面试问题G家onsite面经(感谢放水的国人大哥)
LinkedIn面试题请教请教一道Google面试题
找2个sorted array中的第K小的元素,有O(lgn)方法吗?二维排序数组的查找正解是O(M+N)的复杂度吗
EA 面筋面facebook都得一提多解吗?
相关话题的讨论汇总
话题: 元素话题: log话题: 复杂度话题: matrix话题: length