public class maxproduct , , ,
, ,
};for (int a : aa) else }}
// 對應書上的解法1.空間換時間
public int maxproducta(int a)
int n = a.length;
int s = new int[n];
s[0] = 1;
for (int i = 1; i <= n - 1; i++)
int t = new int[n];
t[n - 1] = 1;
for (int i = n - 2; i >= 0; i--)
int p = integer.min_value;
for (int i = 0; i < n; i++)
}return p;}/*
對應書上的解法2。對乘積作分類討論。書上的分析如下:
計算n個數的乘積為p,然後分p的正負性討論如下:
1,p==0
說明p中必定至少含有乙個0。假設將這個0去掉後得到n-1個元素的乘積為q。
1.1 q==0
返回0。說明n個元素中必有至少兩個0,所以不管去掉什麼元素,n-1個乘積必為0。
1.2 q為正
返回q。說明其中再無0了,若之前去掉的不是0,則剩餘的n-1個的乘積必為0。小於現在的q。
1.3 q為負
返回0,。說明其中再無0了,若之前去掉的不是0,則剩餘的n-1個的乘積必為0。大於現在的q,取大者,所以之前應該保留0。
2,p為負
說明這n個數中無0,並且至少有乙個負數。所以只有去掉乙個絕對值最小的負數才獲得最大乘積q。並且這個負數必定是存在的。
3,p為正
由於可能負負得正,所以現在應該考慮到應該去掉乙個絕對值最小的正數,但是這個正數不一定存在,比如陣列-1,-1。所以如果該正數不存在,就應該去掉乙個絕對值最大的負數。
同時注意,為了避免乘積溢位,建議只統計符號,計算0,正,負的個數 。
*/public int maxproductb(int a)
int n = a.length;
int zerocount = 0;
int negativecount = 0;
int positivecount = 0;
int maxnegative = integer.min_value; // 最大的負整數是-1,初始化應該設為最小的負整數
int minnegative = -1; // 最小的負整數是integer.min_value.,初始化應該設為最大的負整數
int minpositive = integer.max_value; // 最小的正整數,初始化為最大的正整數
for (int i : a)
if (i > 0)
}if (i < 0)
if (minnegative > i) }}
// 設p為陣列所有元素的乘積。q為除去乙個0元素之外其他元素的乘積。
int p = 1;
int excludeitem = 0;
// p=0
if (zerocount >= 2) else if (zerocount == 1) else
} else else
//p<0
} else
}if (p != 0) }}
return p;}}
程式設計之美 子陣列的最大乘積
題目 給定乙個長度為n的整數陣列,只允許用乘法不允許用除法,計算n 1個數組合的乘積最大的一組,並寫出演算法的時間複雜度。最直觀的解法o n2 public static int gettheexpectvaluenormal int data if result r return data ind...
程式設計之美 子陣列的最大乘積
問題 給定乙個長度為n的整數陣列,只允許用乘法,不能用除法,計算任意 n 1 個數的組合中乘積最大的一組,並寫出演算法的時間複雜度。解法一 用乙個陣列儲存從左邊到右邊前i個元素的乘積。用另乙個陣列儲存從右邊到左邊n i個元素的乘積。然後結果就為兩個陣列中元素對應的乘積,複雜度為o n 解法二 設n個...
程式設計之美2 13 子陣列最大乘積
問題描述 給定乙個長度為n的整數陣列,只允許用乘法,不能用除法,計算任意 n 1 個數的組合乘積中最大的一組,並寫出演算法的時間複雜度。解法 1.暴力解法 o n 2 2.前字尾法 o n 3.統計法 o n 具體思路和 1.暴力解法 思路 利用兩層迴圈,依次刪掉乙個,其餘的做乘法,計算出最大的。1...