我需要編寫一個程序來查找給定數組大小爲N的三個數的最大乘積。 有沒有對此有效的算法? 我只需要知道算法步驟。非我認爲適用於所有測試用例的算法。 謝謝! FYI數組可包含+ ve,-ve或零元素)對於給定數組大小爲N的三個數的最大乘積
回答
查找數組中的三個最大數字(n1,n2,n3)和兩個最小數字(m1,m2)。
答案是要麼N1 X N2 N3 X或N1 X M1 X平方米
給定列表的陣列=(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最大的產品包括在基本找到該數組中最大的3個號碼,最小的2號從數組在數組中只需要1次迭代。當然有很多種解決方案,但這是最優的1,因爲解決問題的時間是O(n),其他解決方案時間是O(n lg n)
這裏是java代碼: 順便說一句,有一個保證,輸入數組是非空的,並且包含最少3個元素,所以不需要額外檢查空等等。
int solution(int[] a) {
/*與最大INT初始化以避免在陣列和假量滴極端最大值情況下,最小值0最小值返回*/
INT MIN1 = Integer.MAX_VALUE的;
int min2 =整數。MAX_VALUE;
/*爲最大初始化但當然反轉,以避免在陣列極端最低值的相同的邏輯和假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) {
/*存儲m在一個臨時的無功電流AX1值來測試它後來對第二最大 在這裏,你可以看到的是變化的鏈條,如果改變了我們必須改變,另2 */
int tempMax1 = max1;
//分配最大最大當前數組值作爲針對MAX2最大值
max1=a[i];
//測試tempMax1前MAX1值
if(tempMax1>max2){
/*存儲在MAX2值tempMax2值來測試它AG如果它是更大的ainst MAX3並將其分配給最多3 */
int tempMax2 = max2;
max2 =tempMax1;
if(tempMax2>max3){
max3 = tempMax2;
}
/*測試,看看tempMax1較大,如果不大於MAX3大,當 MAX1得到一個新值與舊這種情況正在發生MAX1的值等於與MAX2但大於MAX3 */
}else{
if(tempMax1>max3){
max3 = tempMax1;
}
}
在殼體/ *如果當前一個[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。這是必要的 ,因爲在數學上2個負值的乘積是正值,並且因爲min1 * min2 * max1的乘積可以大於max1 * max2 * max3 以及由3個最大值構建的乘積。*/
int prod1 = min1 * min2 * max1;
int prod2 = max1 * max2 * max3;
//這裏我們只返回最大的產品
return prod1 > prod2 ? prod1 : prod2;
}
這是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;
}
}
不是一個有效的解決方案,但一個有用的備份顯示數據結構的使用。從這些整數中創建一個最大堆和最小堆。然後從max堆中刪除根,直到獲得3個不同的整數(前3),並從min堆中獲取至少兩個不同的整數。做檢查的其餘部分作爲最大其他應答(MAX1 * MAX2 * MAX3,MAX1,MIN1,MIN2)
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
請向您的代碼添加說明。只是代碼不是一個有用的答案。 – 2016-08-02 06:16:56
雖然此代碼可能有助於解決問題,但提供 有關_why_和/或_how_的其他上下文,它將回答 這個問題將顯着改善其長期價值。 請[編輯]您的答案以添加解釋,包括限制和假設適用的內容。 – 2016-08-02 14:16:37
提到我寫在Python這種簡單的解決方案,我一直在尋找和發現便無法。
def ThreeHighestNumbers(arrayOfNumbers):
PmaxNum1 = 0
PmaxNum2 = 0
PmaxNum3 = 0
NMinNum1 = 0
NMinNum2 = 0
maxNumber = 0
for num in arrayOfNumbers:
if num < 0:
if num < NMinNum1:
NMinNum2 = NMinNum1
NMinNum1 = num
elif num < NMinNum2:
NMinNum2 = num
else:
if num > PmaxNum1:
PmaxNum3 = PmaxNum2
PmaxNum2 = PmaxNum1
PmaxNum1 = num
elif num > PmaxNum2:
PmaxNum3 = PmaxNum2
PmaxNum2 = num
elif num > PmaxNum3:
PmaxNum3 = num
maxNumber = PmaxNum1 * PmaxNum2 * PmaxNum3
if maxNumber == 0:
return []
if maxNumber < PmaxNum1 * NMinNum1 * NMinNum2:
return [PmaxNum1,NMinNum2,NMinNum1]
else:
return [PmaxNum1,PmaxNum2,PmaxNum3]
arraOfNumbers = [1,2,3,4,5,6,-8,-9,0]
print ThreeHighestNumbers(arraOfNumbers)
請使用BubbleSort過程並在三次迭代中中斷。取三個的底部並乘。這應該爲您提供解決方案。
int count = 0, j=a.length;
boolean swap = false;
do
{
swap = false;
for(int i=1;i<j;i++)
{
if(a[i]<a[i-1])
{
int t= a[i];
a[i] = a[i-1];
a[i-1] = t;
swap = true;
}
}
System.out.println(j+" Iteration:"+Arrays.toString(a));
j--;
if(swap)
count++;
} while(swap && count<3);
System.out.println(Arrays.toString(a));
return a[a.length-1]*a[a.length-2]*a[a.length-3];
- 1. 給定一個整數數組(N的大小)和一個數M,求該數組的N-1個元素的乘積M
- 2. 查找給定BST中小於給定數字(n)的最大數字
- 3. Python上數組中兩個最大元素的乘積
- 4. 給定n個數字中的最小和最大10個數字
- 5. 嶺係數大於最小二乘法
- 6. 大於n數組
- 7. 對於一個給定的數N,我如何找到x,S的乘積(x和x的因子數)= N?
- 8. 整數數組中每對的距離和最大值的乘積和
- 9. 大小爲n的數組,其中一個元素n/2次
- 10. $ _POST最大數組大小
- 11. Python:最大數組大小?
- 12. 創建一個小於最大給定值的隨機數
- 13. 你可以用多少種方法構造一個大小爲N的數組,使得任何一對連續元素的乘積不大於M?
- 14. 是否有爲numpy數組定義的最大大小?
- 15. 找到一個小於n的最大素數
- 16. 數組中值的最大大小PHP
- 17. 最大和最小組乘以2列
- 18. 對於給定的最小值和最大值,限制std :: vector
- 19. 用於大型數組大小的Powerset
- 20. 合併大小爲n的k個排序數組的下界
- 21. 產生大小爲n的二進制數元組:itertools.product(* [(0,1)] * N)
- 22. 以相同的大小劃分數組,使給定函數的值最小
- 23. 在固定大小的數組內存儲「N」個記錄
- 24. 固定大小的數組
- 25. 確定數組的大小
- 26. 從用戶輸入n創建一個大小爲n的數組n
- 27. 最近的矩形/正方形給定面積大小
- 28. 大小爲0的數組
- 29. 列表中的最大數小於數
- 30. 定義一個最大面積爲yFiles
爲什麼不只是n1 x n2 x n3? – 2010-02-02 20:35:39
@噴墨,因爲m1和m2可能是很大的負數 – mob 2010-02-02 20:37:02
排除0,當然:) – 2010-02-02 20:40:43