思路一算法
找出全部N-1個數的組合,分別計算它們的乘積,找出最大的。思路很簡單,時間複雜度爲很高O(N*N)編程
思路二數組
採起「空間換時間」策略,下降時間複雜度。spa
數據數組爲a[ ],設置數組s[ ],t[ ]。code
數組s[ ]的每一個元素s[ i ]記錄數組前i個數的乘積,s[ 0 ]設置爲1class
數組t[ ]的每一個元素t[ i ]記錄數組後i個數的乘積,t[ 0 ]設置爲1書籍
數組p[ ]的每一個元素p[ i ]爲前i-1個數和後n-i個數的乘積(即排除第i個數的其餘數的乘積)統計
計算p[ ]的最大值便可
數據
int calculate(int a[],int n) { int sum=1; int * s = (int *)malloc(sizeof(int) * (n)); int * t = (int *)malloc(sizeof(int) * (n)); int * p = (int *)malloc(sizeof(int) * (n+1)); s[0]=t[0]=1; int i; for(i=1;i<n;i++) { //s[i]爲計算前i個數的乘積 s[i]=a[i-1]*s[i-1]; //t[i]爲計算後i個數的乘積 t[i]=a[n-i]*t[i-1]; } for(i=1;i<=n;i++) //p[i]爲前i-1個數和後n-i個數的乘積(即排除第i個數的其餘數的乘積) p[i]=s[i-1]*t[n-i]; free(s); free(t); free(p); //max(p)求數組p的最大值,這裏不實現 return max(p); }
該算法的時間複雜度爲O(n)時間
思路三
根據數組中0,正數,負數的個數來計算
zeroCount, pCount, nCount分別表示0,正數,負數的個數。
1.zeroCount>0 說明最少有一個0,計算除0之外全部數的乘積記作Q,若是Q>0,返回Q,若是Q<0,說明有奇數個負數,因此0爲最大值
2.nCount(負數的個數)爲奇數個,則排除絕對值最小的負數便可
3.nCount爲偶數(包含0),排除最小的正整數便可。
統計zeroCount,pCount,nCount的個數以及查找正整數最大值,負整數最大值時間複雜度都爲O(n),因此總體複雜度都爲O(n)
參考書籍:《編程之美》