• 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;
    
    	}
    
    
    }
    
  • 相关阅读:
    tensorflow学习笔记----TensorBoard讲解
    tensorflow学习笔记----tensorflow在windows的安装及TensorBoard中mnist样例
    vmware workstation环境下虚拟机固定ip的设置
    一致性协议之Paxos算法
    一致性协议之二阶段提交和三阶段提交
    红黑树
    kibana增加验证
    Linux安装nodejs和npm
    Gnu pgp加密解密
    linux记录每次登陆的历史命令
  • 原文地址:https://www.cnblogs.com/CBDoctor/p/2620851.html
Copyright © 2020-2023  润新知