查看: 2389| 回复: 3
跳转到指定楼层
上一主题 下一主题
收起左侧

Amazon : Find minimum|a-b|+|b-c|+|c-a|

全局:

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

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

x
Given 3 arrays, pick 3 nos, one from each array, say a,b,c such that |a-b|+|b-c|+|c-a| is minimum,请给出解答的证明

我只能说这题从证明和程序的编写上远没有开始预料的那么简单

上一篇:【通知】新添加的CAS用户组可以发主题帖了!
下一篇:Google/Yahoo Find the best buy and sell point
🔗
epic 2011-6-28 12:50:40 | 只看该作者
全局:
分情况讨论,考虑abc之间的大小关系,最多只有3!=6种
以a>b>c为例,则原式简化为a-b+b-c+a-c=2a-2c

只需取a中最大,c中最小即可。b甚至都不用检查(因为如果没有b在[a,c]之间的话,在其他的讨论中会获得更好的答案)

不知道对不对?
回复

使用道具 举报

🔗
 楼主| wwwyhx 2011-6-28 21:55:45 | 只看该作者
全局:
分情况讨论,考虑abc之间的大小关系,最多只有3!=6种
以a>b>c为例,则原式简化为a-b+b-c+a-c=2a-2c

只需取a中最大,c中最小即可。b甚至都不用检查(因为如果没有b在[a,c]之间的话,在其他的讨论中会获得更好的答案)

不知道对不对?
epic 发表于 2011-6-28 12:50


你这个时间复杂度岂不是n^2?
回复

使用道具 举报

🔗
 楼主| wwwyhx 2011-6-28 22:07:12 | 只看该作者
全局:
对三个数组排序,时间复杂度nlogn

做一个三路merge sort, 每次对A,B,C中最小的a,b,c三个数做判断,同时更新结果。
在a,b,c中取最小的数x, x进到下一个元素,这样新的3元素对就形成了。

这是解法,证明这个解法的正确性比较麻烦。同时要证明加入a == b < c, 那么是递增A数组还是B数组。
需要证明递增A,B可以,结果都是一样的。这套证明的关键就是你指出的|a-b|+|b-c|+|c-a| 只和最大最小的两个元素相关,和中间那个无关,每一个iteration唯一可以改良的办法就是递增最小元素所在的那个数组。

int CalcABS(int a, int b, int c)
{
        return abs(a-b) + abs(a-c) + abs(b-c);
}

int GetMin(vector<int>& vec)
{
        assert(!vec.empty());
       
        int nMin = vec[0];
        for (int i = 0; i < vec.size(); i++)
        {
                if (vec[i] < nMin)
                        nMin = vec[i];
        }

        return nMin;
}

int GetABC(int a[], int na, int b[], int nb, int c[], int nc, int& sa, int& sb, int& sc)
{
        assert(a && na>0 && b && nb>0 && c && nc>0);

        sort(a, a+na);
        sort(b, b+nb);
        sort(c, c+nc);

        int i = 0;
        int j = 0;
        int k = 0;
        sa = sb = sc = 0;

        int nMin = CalcABS(a[i], b[j], c[k]);
        while (i != na-1 || j != nb-1 || k != nc-1)
        {
                vector<int> vec;
                if (i != na-1) vec.push_back(a[i]);
                if (j != nb-1) vec.push_back(b[j]);
                if (k != nc-1) vec.push_back(c[k]);

                int nRes = GetMin(vec);

                if (i != na-1 && a[i] == nRes)
                        i++;
                else if (j != nb-1 && b[j] == nRes)
                        j++;
                else k++;

                nRes = CalcABS(a[i], b[j], c[k]);
                if (nRes < nMin)
                {
                        sa = a[i];
                        sb = b[j];
                        sc = c[k];
                        nMin = nRes;
                }
        }

        return nMin;
}
回复

使用道具 举报

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

本版积分规则

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