題目描述:給定乙個長度為n的整數陣列,只允許用乘法,計算任意(n-1)個數的組合中乘積最大的一組,並寫出演算法的時間複雜度。
演算法分析:
1、二逼青年的做法,把所有可能的(n-1)個數的組合照出來,分別計算它們的乘積,並比較大小。好吧~時間複雜度是o(n^2),這種效率,我連**都懶得寫。
面試100題系列之3關於一種拆分思路的演算法,這裡就不廢話了,碼字也很辛苦的說~~~
3、從數學的角度來分析一下。要求的是最大值,而且需要抽取n-1個數,也就是捨棄乙個數唄~與其去找需要的n-1個數,還不如去確定需要捨棄的數。怎麼確定呢?
*如果0的個數超過2個,那不管捨棄什麼數,剩下的至少有乙個0,那結果肯定是0啦。
*如果只有1個0呢?如果負數個數為奇數,那捨棄0的話肯定就得到乙個負數,那還不如得到0呢!也就是說這種情況隨便捨棄乙個不為0的數就可以了。如果負數的個數是偶數,把0捨棄就可以了。
*如果沒有0,那就好辦了。負數個數為奇數,捨棄絕對值最小的負數。否則捨棄絕對值最大的正數就可以了。
當然所有的關於上面的資訊都可以在遍歷一次陣列後得到。知道需要捨棄哪乙個之後,重新遍歷一遍陣列,乘的時候跳過那個元素就可以了。核心**如下:
double getmaxproduct(double *arr, int nlen)
else if(arr[i] > bound)
else
}//1個0,奇數個負數
if(zerocnt && (nagcnt & 1))
return 0.0;
//確定需要去除的元素
double except;
if(nagcnt & 1)
except = maxnag;
else
except = zerocnt ? 0.0 : minpos;
minpos = 1;//重複利用變數minpos來存放ans
for(i = 0; i < nlen; ++i)
return minpos;
}
下面給出一些輔助函式和變數的定義,以及main函式的呼叫,不需要的可以pass了:
#includeconst double inf = 1e5;
const double bound = 1e-6;
inline double min(const double a, const double b)
inline double max(const double a, const double b)
int main()
}
程式設計之美系列之求子陣列的連續最大和
乙個有n個整數元素 可以是負數 的一維陣列,連續的子陣列有很多,那連續的子陣列之和的最大值是什麼呢?而這個和最大的子陣列是哪一段資料呢?下面就讓我們來一一的剖析這個問題。首先撇開後面乙個問題,不考慮究竟是哪一段資料,只需要求出最大的和就可以了。1 在說思路之前,先看看網上比較流行的解法,到底這裡面有...
程式設計之美 子陣列的最大乘積
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 n...
程式設計之美 子陣列的最大乘積
題目 給定乙個長度為n的整數陣列,只允許用乘法不允許用除法,計算n 1個數組合的乘積最大的一組,並寫出演算法的時間複雜度。最直觀的解法o n2 public static int gettheexpectvaluenormal int data if result r return data ind...