我的作业中有一些问题,我给了两个数组A,B(它们已经排序),每个都有n个元素,我需要找到(n * logn)最小元素(如果可能的话,还是n)从数组中得到的元素是数组A中的一个元素和数组B中的一个元素total number of elemnts in C will be n^2
, - C = {a+b | a belongs to A, b belongs to B}
的总和,我需要使用复杂度O(n * logn)。
在此先感谢您的帮助!
P.S。我试图解决它,但我有一些问题。我知道第一个元素是a1 + b1
,a1是A的第一个元素,b1是来自B的第一个元素。
C中的所有元素都是不同的。
答案 0 :(得分:3)
下面这段代码将使用你给出的提示2个元素进行排序,它的顺序是找到所需元素的数量:
int m = n *lon(n);
a[n] = max_int;
b[n] = max_int;
for(int i=0,j=0;i+j<m;)
{
if(a[i+1]+b[j] < a[i]+b[j+1])
{
c[i+j] = a[i+1]+b[j];
i++;
}
else
{
c[i+j] = a[i]+b[j+1];
j++;
}
}
答案 1 :(得分:1)
我没有给你答案,但这里有一些提示让你思考正确的方向。
所以,假设你有。请记住,这些列表已经排序,这非常重要。 {A1,A2,A3} {B1,B2,B3}
正如你所说,第一个元素是a1 + b1。为什么?因为它们是两个数组中最小的数字,所以它们的总和将是最小的。
现在您对第二个元素有什么选择?请记住,列表已排序! 可能是a1 + b2吗? 可能是a1 + b3吗? 然后相反, 可能是b1 + a2吗? 可能是b1 + a3吗?
可能是b2 + a2吗? (两个是答案,三个没有答案)
使用它你应该能够弄清楚如何找到第二个最小的元素,从这里应该很容易找到如何为所有元素做到这一点。
如果您仍然感到困惑,请在评论中提问。
GL!
答案 2 :(得分:0)
找到A中的最小元素(让我们称之为a)和B(b)中的最小元素。 C中最小的元素是a + b。
如果你需要C中该元素的位置,如果第一个元素是a1 + b1,第二个是a1 + b2等,所需元素的位置将是pos(a) * size(B) + pos(b)
。
答案 3 :(得分:0)
这是一个常见的家庭作业问题。由于A和B数组是排序的,你可以进行成对合并,几乎就像合并排序一样,唯一的区别是你要比较总和,而不是数字本身。换句话说,你的指针当前位于A_i和B_j,你刚刚将A_i + B_j添加到列表C中。下一个元素可能是A_i + B_ {j + 1}或者它可能是A_ {i + 1} + B_j 。只需看看哪个更小,然后向前移动指针。
看来你已经开始了,anothem的答案(或者更确切地说是问题!)必须已经引导你朝着正确的方向前进,但如果你有更多问题,请随时提出。
[PS:没理由担心数组A,B或C中的重复。重复项不会改变此问题的任何内容。将数据结构视为列表,而不是设置。] < / p>