由买买提看人间百态

boards

本页内容为未名空间相应帖子的节选和存档,一周内的贴子最多显示50字,超过一周显示500字 访问原贴
JobHunting版 - 一道题目
相关主题
两道2009算法题备考google onsite, 讨论堆排序的时间复杂度
贡献一道某 virtualization 大公司online coding test 的题priority_queue C++ implementation
CS intern面经Citibank 第二轮
刚面完 google,题目O(1)space解法到底能不能用递归?
也问一个median的问题share一下最近三个电话面试题Amazon, Groupon, Google
找最大俩数的代码怎么写?请问可以用二分法判断一个数组是否sorted吗?
问个老题,find the next larger in BSTfind median for k sorted arrays
Quick sort为什么需要logN的memory?两个Amazon面试题
相关话题的讨论汇总
话题: int话题: intarrs话题: pointers话题: return话题: ans
进入JobHunting版参与讨论
1 (共1页)
d********t
发帖数: 9628
1
N组整数,每组都由小到大排列,如何快速找出N组都有的最大数?
p*****2
发帖数: 21240
2
从后往前找,当前数最大值的往前走。一直走到大家数值都相等。
d********t
发帖数: 9628
3
兔爷就是牛

【在 p*****2 的大作中提到】
: 从后往前找,当前数最大值的往前走。一直走到大家数值都相等。
p*****2
发帖数: 21240
4

好久没见你了。已经开始上班了?

【在 d********t 的大作中提到】
: 兔爷就是牛
d********t
发帖数: 9628
5
上班很久了感觉,人生彻底绝望。

【在 p*****2 的大作中提到】
:
: 好久没见你了。已经开始上班了?

c***p
发帖数: 221
6
N-way merge with order from large to small. stop when find equal value for
all sequences, or any sequence run out.

【在 d********t 的大作中提到】
: N组整数,每组都由小到大排列,如何快速找出N组都有的最大数?
S*******w
发帖数: 24236
7
纽约妞很多
泡几个就不绝望了

【在 d********t 的大作中提到】
: 上班很久了感觉,人生彻底绝望。
d********t
发帖数: 9628
8
人家一听偶IT打杂男就不理不睬了。

【在 S*******w 的大作中提到】
: 纽约妞很多
: 泡几个就不绝望了

S*******w
发帖数: 24236
9
是个男的就行了吧

【在 d********t 的大作中提到】
: 人家一听偶IT打杂男就不理不睬了。
d********t
发帖数: 9628
10
哈哈,你想得挺美啊。

【在 S*******w 的大作中提到】
: 是个男的就行了吧
相关主题
找最大俩数的代码怎么写?备考google onsite, 讨论堆排序的时间复杂度
问个老题,find the next larger in BSTpriority_queue C++ implementation
Quick sort为什么需要logN的memory?Citibank 第二轮
进入JobHunting版参与讨论
S*******w
发帖数: 24236
11
帅就行了

【在 d********t 的大作中提到】
: 哈哈,你想得挺美啊。
d********t
发帖数: 9628
12
矮丑穷

【在 S*******w 的大作中提到】
: 帅就行了
Z*****Z
发帖数: 723
13
我觉得直接上K way merge可能不是最优的。
假设N个数组,每个数组里有N个数,一共有N^2个数,(最大)堆的size也是N。Kway m
erge的复杂度是O(N^2 * lgN)
如果不用堆,而用一个size 为N的数组存储N个指针,每个指针指向自己的数组,可以做
到O(N2)

【在 c***p 的大作中提到】
: N-way merge with order from large to small. stop when find equal value for
: all sequences, or any sequence run out.

Z*****Z
发帖数: 723
14
上代码。
static int findCommon(int[][] intArrs){

if(intArrs == null || intArrs.length == 0){
return -1;
}

for(int[] arr : intArrs){
if(arr == null || arr.length == 0){
return -1;
}
}

int[] pointers = new int[intArrs.length];

int ans = intArrs[0][0];

boolean found = false;
while(!found){

found = true;
for(int i = 0; i < intArrs.length; i ++){
int p = pointers[i];
while(p < intArrs[i].length && intArrs[i][p] < ans){
p ++;
}
pointers[i] = p;
if(p >= intArrs[i].length){
return -1; // no such element
}
if(intArrs[i][p] > ans){
ans = intArrs[i][p];
found = false;
}
}

}

return ans;

}
public static void main(String[] args) {

int[][] intArrs = {
{1, 3, 5, 7, 9},
{2, 4, 6, 7, 10},
{1, 2, 3, 5, 7, 9},
};

System.out.println(findCommon(intArrs));
}

m
以做

【在 Z*****Z 的大作中提到】
: 我觉得直接上K way merge可能不是最优的。
: 假设N个数组,每个数组里有N个数,一共有N^2个数,(最大)堆的size也是N。Kway m
: erge的复杂度是O(N^2 * lgN)
: 如果不用堆,而用一个size 为N的数组存储N个指针,每个指针指向自己的数组,可以做
: 到O(N2)

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

m
以做
这个算法不错呀。我发现你玩指针数组很牛呀。

【在 Z*****Z 的大作中提到】
: 我觉得直接上K way merge可能不是最优的。
: 假设N个数组,每个数组里有N个数,一共有N^2个数,(最大)堆的size也是N。Kway m
: erge的复杂度是O(N^2 * lgN)
: 如果不用堆,而用一个size 为N的数组存储N个指针,每个指针指向自己的数组,可以做
: 到O(N2)

Z*****Z
发帖数: 723
16
其实就这一招。。。被二爷发现了。。。

【在 p*****2 的大作中提到】
:
: m
: 以做
: 这个算法不错呀。我发现你玩指针数组很牛呀。

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

哈哈。偷学了。见你这么用两次了。

【在 Z*****Z 的大作中提到】
: 其实就这一招。。。被二爷发现了。。。
Z*****Z
发帖数: 723
18
二爷法眼,一针见血

【在 p*****2 的大作中提到】
:
: 哈哈。偷学了。见你这么用两次了。

c***p
发帖数: 221
19
cool! 用heap的确浪费时间了, 每排除1个数要花费logN个比较。
学习了!
如果时间复杂度允许是O(N^2 * lgN),那么空间复杂度可以降到O(1)。

m
以做

【在 Z*****Z 的大作中提到】
: 我觉得直接上K way merge可能不是最优的。
: 假设N个数组,每个数组里有N个数,一共有N^2个数,(最大)堆的size也是N。Kway m
: erge的复杂度是O(N^2 * lgN)
: 如果不用堆,而用一个size 为N的数组存储N个指针,每个指针指向自己的数组,可以做
: 到O(N2)

e****e
发帖数: 418
20

Thanks for your idea, erYe. Here is the code.
public static int findMaxInEveryArray(int[][] m) {

if ( m == null || m.length == 0 )
return -1;

int[] pointers = new int[m.length];
for( int i = 0; i < m.length; i++ ){
if ( m[i] == null || m[i].length == 0 ) {
return -1;
}
pointers[i] = m[i].length -1;
}

while ( true ) {
if ( isAllEqual( m, pointers ) )
break;

int maxIndex = indexOfMaxNumberInPointerArray( m, pointers );
if ( maxIndex < 0 )
return -1;
else
pointers[maxIndex]--;
}
return m[0][pointers[0]];
}

public static boolean isAllEqual(int[][] m, int[] pointers) {
int first = m[0][pointers[0]];

for ( int i = 1; i < pointers.length; i++ ) {
if ( m[i][pointers[i]] != first ) {
return false;
}
}

return true;
}

public static int indexOfMaxNumberInPointerArray(int[][] m, int[]
pointers) {
int maxIdx = 0;
int max = Integer.MIN_VALUE;
for ( int i = 0; i < pointers.length; i++ ) {
if ( m[i][pointers[i]] > max ) {
max = m[i][pointers[i]];
maxIdx = i;
}

}

return maxIdx;
}

【在 p*****2 的大作中提到】
: 从后往前找,当前数最大值的往前走。一直走到大家数值都相等。
d********t
发帖数: 9628
21
idea很棒,可惜有bug。如果各个数组都是1开头,你的指针都动不了。

【在 Z*****Z 的大作中提到】
: 上代码。
: static int findCommon(int[][] intArrs){
:
: if(intArrs == null || intArrs.length == 0){
: return -1;
: }
:
: for(int[] arr : intArrs){
: if(arr == null || arr.length == 0){
: return -1;

Z*****Z
发帖数: 723
22
我找的是最小的那个common元素

【在 d********t 的大作中提到】
: idea很棒,可惜有bug。如果各个数组都是1开头,你的指针都动不了。
1 (共1页)
进入JobHunting版参与讨论
相关主题
两个Amazon面试题也问一个median的问题
怎么判断一个数的二进制是不是回文数找最大俩数的代码怎么写?
LinkedIn家电面面经问个老题,find the next larger in BST
Pow有没有比log(n)更好点的解法?Quick sort为什么需要logN的memory?
两道2009算法题备考google onsite, 讨论堆排序的时间复杂度
贡献一道某 virtualization 大公司online coding test 的题priority_queue C++ implementation
CS intern面经Citibank 第二轮
刚面完 google,题目O(1)space解法到底能不能用递归?
相关话题的讨论汇总
话题: int话题: intarrs话题: pointers话题: return话题: ans