我需要编写一个程序来查找给定数组大小为N的三个数字的Max乘积。 这有什么有效的算法吗? 我只需要知道算法步骤。不是我认为适用于所有测试用例的算法。 谢谢! FYI数组可能包含+ ve,-ve或零元素
答案 0 :(得分:32)
找出数组中的三个最大数字(n1,n2,n3)和两个最小数字(m1,m2)。
答案是n1 x n2 x n3或n1 x m1 x m2
答案 1 :(得分:1)
该方法获得3的最大乘积基本上是从阵列中找到最大的3个数字,并且在阵列上只需1次迭代就可以找到数组中最小的2个数字。当然有很多种解决方案,但这是最优的1,因为解决问题的时间是O(n),其他解决方案的时间是O(n lg n)
这是java代码: 顺便说一下,保证输入数组非空并且包含最少3个元素,因此不需要额外检查空等等。
int solution(int[] a) {
/ *使用max int初始化的最小值,以避免数组中极端最大值的情况和false最小值返回0最小值* /
int min1 = Integer.MAX_VALUE;
int min2 = Integer.MAX_VALUE;
/ *最大初始化的逻辑相同,但当然是反转以避免数组中的极端最小值和false 0最大值* /
int max1 = Integer.MIN_VALUE;
int max2 = Integer.MIN_VALUE;
int max3 = Integer.MIN_VALUE;
//遍历数组
for (int i = 0; i < a.length; i++) {
//测试max1是否小于当前数组值
if (a[i] > max1) {
/ *将max1当前值存储在temp var中,以便稍后对第二个最大值进行测试 在这里你可以看到一连串的变化,如果改变最大的最大值我们必须改变另一个2 * /
int tempMax1 = max1;
//将当前数组值指定为最大值
max1=a[i];
//测试tempMax1前max1值对max2
if(tempMax1>max2){
/ *在tempMax2值中存储max2值以对max3进行测试,如果它更大则将其分配给最大值* /
int tempMax2 = max2;
max2 =tempMax1;
if(tempMax2>max3){
max3 = tempMax2;
}
/ *测试看看tempMax1是否更大,如果不大于max3,这发生在 max1获取一个新值,max1的旧值等于max2但大于max3 * /
}else{
if(tempMax1>max3){
max3 = tempMax1;
}
}
/ *如果当前a [i]不大于max1,我们测试它以查看可能大于秒 最大。然后将上面相同的逻辑应用于max3 * /
}else if(a[i]>max2){
int tempMax2 = max2;
max2 = a[i];
if(tempMax2>max3){
max3 =tempMax2;
}
/ *最后如果当前数组值不大于max1且max2可能大于max3 * /
}else if(a[i]>max3){
max3 = a[i];
}
/ *上面带有最大值的逻辑在这里以最小值应用,但当然是反转为 从当前数组中发现2个最小值。 * /
if (a[i] < min1) {
int tempMin1 = min1;
min1 = a[i];
if (tempMin1 < min2) {
min2 = tempMin1;
}
} else if (a[i] < min2) {
min2 = a[i];
}
}
/ *之后我们发现了阵列中3个最大的最大值和2个最小的最小值 我们从最大最大值和最小值2个中选择3个产品。这是必要的 因为在数学上2个负值的乘积是正值,并且因为 这个min1 * min2 * max1的乘积可以大于max1 * max2 * max3 并且产品由3个最大值构成。 * /
int prod1 = min1 * min2 * max1;
int prod2 = max1 * max2 * max3;
//这里我们只返回最大的产品
return prod1 > prod2 ? prod1 : prod2;
}
答案 2 :(得分:0)
给定一个list =(n1,n2,n3 ......)的数组。你可以通过3次传球。
Let a1 = max (|n_i|)
Let a2 = max (|n_i|) where n_i != a1
现在a1 * a2是正数,负数或零。如果为零那么有很多解决方案;从剩下的数字中选择任何n_i。如果a1 * a2> 0然后选择最大的正数,否则最小的负数。更简洁的是,您可以通过列表的其余部分进行一次传递:
Let max_product = max (a1*a2*n_i) where n_i != a1 or a2
答案 3 :(得分:0)
这是Java中的一个很好的解决方案:
class Solution {
public int solution(int[] A) {
int result1, result2;
Arrays.sort(A);
result1 = A[0] * A[1] * A[A.length-1];
result2 = A[A.length-1] * A[A.length-2] * A[A.length-3];
if (result1 >= result2) return result1;
else return result2;
}
}
答案 4 :(得分:0)
不是一种有效的解决方案,而是一种显示数据结构使用的有用备份。从这些整数中创建最大堆和最小堆。然后从最大堆中删除根,直到获得3个不同的整数(前3个),并从最小堆中获取至少两个不同的整数。其他响应中提到的其余检查是max(max1 * max2 * max3,max1,min1,min2)
答案 5 :(得分:0)
def max_three_product(a):
a=sorted(a)
max_prod=a[-1]*a[-2]*a[-3]
if a[0]>0:
return a[-1]*a[-2]*a[-3]
else:
if a[0]*a[1]<0:
return max_prod
elif a[1]*a[2]>0:
if a[0]*a[1]*a[-1]>max_prod:
return a[0]*a[1]*a[-1]
else:
return max_prod
else:
if a[0]*a[1]*a[-1]>max_prod:
return a[0]*a[1]*a[-1]
else:
return max_prod
答案 6 :(得分:0)
我在Python中写了这个简单的解决方案,我正在寻找并且无法找到。
{{1}}
答案 7 :(得分:0)
请使用BubbleSort程序并在三次迭代中中断。取三个底部并乘以。这应该为您提供解决方案。
function rot13(str) { // LBH QVQ VG!
var string = str.split('');
var codedStr = [];
var encoded = [];
for (var k=0; k < string.length; k++){
codedStr.push(string[k].charCodeAt());
}
for(var i = 0; i < codedStr.length; i++){
if(codedStr[i] > 77 ){
codedStr[i] -= 13;
}
else if( codedStr[i] == 32 || codedStr[i] == 63){
codedStr[i] = codedStr[i];
}
else{
codedStr[i] += 13;
}
encoded.push(codedStr[i]);
}
var decode = codedStr.map(String.fromCharCode);
var result = decode.join('');
return result;
}
// Change the inputs below to test
console.log(rot13("SERR PBQR PNZC"));