📣 Back to School开学季 - VIP通行证5折优惠!蓝莓、Offer多多同步优惠
查看: 3944| 回复: 11
跳转到指定楼层
上一主题 下一主题
收起左侧

Google : 就地寻找两数组中第k大的数

全局:

注册一亩三分地论坛,查看更多干货!

您需要 登录 才可以下载或查看附件。没有帐号?注册账号

x
两个数组,就地(不用额外空间)找出合并后第k大的数

int[] a= [3 1 7]
int[] b = [4 9]
k: 3
return 4.

上一篇:Google : 构建特殊堆
下一篇:Microsoft : Find anagram pairs
🔗
intersun 2011-6-17 01:13:25 | 只看该作者
全局:
连个临时变量都不让声明吗。。。还是能用O(1)的空间。
回复

使用道具 举报

🔗
MontagueHu 2011-6-20 09:02:00 | 只看该作者
全局:
如果可以使用O(k)空间的话,priority_queue就行了。如果O(1)空间,感觉就要sort两个array,然后binary search了
回复

使用道具 举报

🔗
 楼主| wwwyhx 2011-6-20 19:48:58 | 只看该作者
全局:
如果可以使用O(k)空间的话,priority_queue就行了。如果O(1)空间,感觉就要sort两个array,然后binary search了
MontagueHu 发表于 2011-6-20 09:02


    说说我想到的一个解法:
    O(1)的空间,就是说不能再分配一个数组把所有数装进来

    可以写一个函数,它负责取“假设”两个数组合并后的第i个元素的地址,然后就和一个数组的Topk问题一样求解

int* GetIndex(int nIndex, int a[], int n, int b[], int m)
{
        assert(nIndex>=0 && a && b && n>0 && m>0);

        if (nIndex < n)
                return a+nIndex;

        return b+nIndex-n;
}

int _inner_get_kth(int a[], int n, int b[], int m, int k, int nStart, int nEnd)
{
        assert(a && b && n>0 && m>0 && k>=0 && k<m+n);

        int i = nStart;
        int j = nEnd;
        bool bInLeft = true;
        while (i != j)
        {
                if (*GetIndex(i, a, n, b, m) <= *GetIndex(j, a, n, b, m))
                {
                        if (bInLeft)
                                j--;
                        else
                                i++;
                }
                else
                {
                        int* pi = GetIndex(i, a, n, b, m);
                        int* pj = GetIndex(j, a, n, b, m);
                        int nTmp = *pi;
                        *pi = *pj;
                        *pj = nTmp;

                        bInLeft = !bInLeft;
                }
        }

        if (i+1 == k) return *GetIndex(nStart, a, n, b, m);

        if (i+1 > k)
                return _inner_get_kth(a, n, b, m, k, nStart, i-1);

        return _inner_get_kth(a, n, b, m, k, i+1, nEnd);
}

int GetKth(int a[], int n, int b[], int m, int k)
{
        assert(a && b && n>0 && m>0 && k>=0 && k<m+n);
        return _inner_get_kth(a, n, b, m, k, 0, m+n-1);
}

O(n)时间复杂度
回复

使用道具 举报

🔗
lambda2fei 2012-9-4 16:48:06 | 只看该作者
全局:
不就是快排的partition的过程修改一下吗。又或者用线性时间的寻找中位数的方法。
回复

使用道具 举报

🔗
CStick75 2012-9-6 21:46:31 | 只看该作者
全局:
逻辑上连在一起好了……物理上连不连其实不重要啊
回复

使用道具 举报

🔗
sing1ee 2012-9-28 23:09:40 | 只看该作者
全局:
我的想法
1)两个数组各自快排
2)两个索引分别从大到小遍历,计数topk=0,当索引指向的当前值大的,topk++,该索引--,知道topk=k。

回复

使用道具 举报

🔗
285845348 2012-10-9 03:41:00 | 只看该作者
全局:
反正都在内存里面,Partition稍微变化一下
另外可以考虑一下,不能全部load进内存的一串整数的Kth问题
回复

使用道具 举报

🔗
secretgu 2012-11-2 12:01:32 | 只看该作者
全局:
我勒个去,我手滑不小心点到“杂草“,怎么办= =求W大,K姐帮忙后台改一下= =
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册账号
隐私提醒:
  • ☑ 禁止发布广告,拉群,贴个人联系方式:找人请去🔗同学同事飞友,拉群请去🔗拉群结伴,广告请去🔗跳蚤市场,和 🔗租房广告|找室友
  • ☑ 论坛内容在发帖 30 分钟内可以编辑,过后则不能删帖。为防止被骚扰甚至人肉,不要公开留微信等联系方式,如有需求请以论坛私信方式发送。
  • ☑ 干货版块可免费使用 🔗超级匿名:面经(美国面经、中国面经、数科面经、PM面经),抖包袱(美国、中国)和录取汇报、定位选校版
  • ☑ 查阅全站 🔗各种匿名方法

本版积分规则

>
快速回复 返回顶部 返回列表