Arrays 给定一个正整数数组,重新排列数组,使相邻元素的乘积之和最大化

Arrays 给定一个正整数数组,重新排列数组,使相邻元素的乘积之和最大化,arrays,algorithm,Arrays,Algorithm,面试问题。我正在寻找一种比O(n^2)更好的算法,其中n是输入数组的大小。(n这是一个带有O(n*logn)的解决方案: 取数组a,并对其中所有(可能的)元素进行排序。所谓可能,我指的是那些在b数组中的索引为true的元素。此步骤需要O(n*logn) 已弃用: 给定obj函数,您需要将最大的数字乘以第二大的数字,第二大的数字乘以第三大的数字,等等。在这里可以通过将a[0]与最小的数字交换,然后a[1]将是最大的数字,等等来进行一些优化。(使用a=[1,2,3,4,8]obj更大)。在任何情况下

面试问题。我正在寻找一种比O(n^2)更好的算法,其中n是输入数组的大小。(n这是一个带有
O(n*logn)
的解决方案:

取数组
a
,并对其中所有(可能的)元素进行排序。所谓可能,我指的是那些在b数组中的索引为true的元素。此步骤需要
O(n*logn)

已弃用:
给定obj函数,您需要将最大的数字乘以第二大的数字,第二大的数字乘以第三大的数字,等等。在这里可以通过将
a[0]
与最小的数字交换,然后a[1]将是最大的数字,等等来进行一些优化。(使用
a=[1,2,3,4,8]
obj更大)。在任何情况下,由于您已经对数组进行了排序,因此此步骤非常简单。
O(n)

编辑:
考虑到obj功能,在与@Edward Doolittle交谈后,这可能是最好的安排:

[1, ..., n-4, n-2, n, n-1, n-3, ...., 2]
编辑2:

处理无法移动的元素:首先对可以排序的元素进行排序。然后查看它们可以到达的位置,并根据两侧的乘数对位置进行排序。因此,如果可选位置的一侧有8个,另一侧有3个,则乘数的值为24。然后将最高值的元素分配给最高的value位置


现在还不能证明这是最优的,但这并不遥远。我想。

n的最大范围是多少?你的
O(n^2)是多少
执行此操作的算法?我认为您可以寻找增加obj值的交换,并在不再有此类交换时停止。通常这只会给出局部最大值,而不是全局最大值,但函数的特殊形式可能意味着只有一个局部最大值=全局最大值。交换是排序的一部分,因此可能意味着e是一个O(n log n)的解决方案……我在采访中被告知n将小于5000。@Kaidulisam我没有O(n^2),但我被要求提供一个比这更好的解决方案。既然
n<5000
是有保证的,为什么不在数组中填充0,直到得到长度为5000的数组。然后使用蛮力,它将是
O(1)默认情况下,最大的元素应该在数组的中间,而不是结束,这样第二个和第三个最大的都可以乘以它,不是吗?那么,我们想要第四个最大的乘以第二个最大的或最大的第三个吗?我正在精确地考虑。理想地,我想成对地将前三个数字相乘。是不可能的,n*(n-1)和n*(n-2)可以。然后再做(n-1)*(n-3)和(n-2)*(n-4)。这让我想到你说的:1,…,n-4,n-2,n,n-1,n-3,…,2tanks!你的算法运行在O(n*logn)如果正整数数组未排序且其位置没有约束。如果添加了位置约束,您将如何适应此方法?