日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

子数组的最大乘积

發布時間:2025/4/16 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 子数组的最大乘积 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

? ? ?給定一個長度為N的整數數組,只允許使用乘法,不能用除法,計算任意N-1個數的組合中乘積中最大的一組,并寫出算法的時間復雜度。


算法一:? 枚舉每一個不在N-1內的數,分別計算剩余N-1個數的乘積,?

由于有N種情況,沒種情況遍歷計算乘積,所以n2.

方法一#include<iostream> #include<cstdlib> #include<ctime> using namespace std;long long LevelOne(const int *d, unsigned int n) {long long ret;long long max;int i, j;for(i=0; i<n; i++){for(j=0, ret=1; j<n; j++){ret *= ((i==j) ? 1 : d[j]);if(ret == 0) break;}max = (i==0 ? ret : max);max = (max<=ret ? ret : max);}return max; }int main() {const int maxsize = 10;int data[maxsize];long long max;srand(time(NULL));for(int i=0; i<maxsize; i++)data[i] = ((rand()%10<2) ? -1:1) * (rand()%10);for(int i=0; i<maxsize; i++)cout<<data[i]<<" ";cout<<endl;max = LevelOne(data, maxsize);cout<<"max: "<<max<<endl;return 0; }

方法二:

對于數組A[N],假設這樣思考假設去除第i個元素的乘積可以表示為A[0]*A[1]*…A[i-1] * A[i+1]*A[i+2]*…A[N-1],則可以寫出如下算法滿足復雜度為Ο(N)。 ?1.算出A[0]~A[N-1],N個元素的乘積賦值給M ?2.定義變量i=N-1, R=1,和數組p[N] ?3.如果i==0 p[0] = A[0] 返回 ?4.如果i>=0 重復步驟5 ?5.M /= A[i]; p[i] = M*R; R *= A[i] ? 但是本算法使用了除法,而規定不允許,所以可以做個小的調整。設f[i]=A[0]*A[1]*…A[i], r[i]=A[i]*A[i+1]*…A[N]則p[i] = f[i-1]*r[i+1]。

方法二long long LevelTwo(const int *d, unsigned int n) {int *f = new int [n];int *r = new int [n];long long *p = new long long [n];long long max;assert(f!=0 && r!=0 && p!=0);long long fv=1, rv=1;for(int i=0; i<n; i++){int j = n-i-1;fv *= d[i];rv *= d[j];f[i] = fv;r[j] = rv;}max = p[0] = r[1];for(int i=1; i<n; i++){p[i] = f[i-1] * r[i+1];max = max<p[i] ? p[i] : max;}delete [] f;delete [] r;delete [] p;return max; }


總結

以上是生活随笔為你收集整理的子数组的最大乘积的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。