2.13子数组的最大乘积
问题:给定一个长度为N 的整数数组,只允许用乘法,不能用除法,计算任意(N-1)个数的组合乘积中最大的一组,并写出算法的时间复杂度。
----------------------------------------
看到这个题目,我的第一感觉是只要找到该数组中最小的数,然后排除这个数不就可以吗?
但是问题是如果数据都是正数还好,上面的办法可以实现,但是如果有负数,问题就比较难办。我们采用最基本的方法,就是把任意的N-1个数抽取,然后有N次这样的组合,算法的时间复杂度为:O(N^2)
我们可以很快的写出代码:
#include <iostream> using namespace std; void func1(int a[], const int n) { float b[10]={1,1,1,1,1,1,1,1,1,1}; for (int i = 0;i<n;i++) { for(int j = 0;j<n;j++) { if(i == j) { } else { b[i] = b[i]*a[j]; } } cout<<b[i]<<endl; b[i]=1; } } void main() { int a[10] = {1,3,4,0,2,1,2,9,3,4}; func1(a,10); }
第二种方法:
using namespace std; void func2(int a[], const int n) { int s[11];//定义前n个数的积 int t[11];//定义后n个数的积 int p[11];//积 s[0] = 1; t[n] = 1; //输出数组前1-n的乘积 for(int m =1;m<n+1;m++) { s[m] = s[m-1]*a[m-1]; cout<<s[m]<<' '; } cout<<endl; //输出后n-1的乘机 for(int k=n-1;k>-1;k--) { t[k] = t[k+1]*a[k]; cout<<t[k]<<' '; } cout<<endl; for(int v= 1;v<n+1;v++) { p[v] = s[v]*t[v+1]; cout<<p[v]<<endl; } }