程式設計之美 子陣列的最大乘積

2021-09-01 09:49:50 字數 1749 閱讀 2945

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...