zoukankan      html  css  js  c++  java
  • 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;
    
    	}
    
    
    }
    
  • 相关阅读:
    标准库中的生成器函数
    Python 数据分析5
    Chrome 开发者工具(三)------ Sources
    Chrome 开发者工具(二)------ Console
    Chrome 开发者工具 F12(一)
    jquery 获取自定义属性的值 data-*
    PHP 常用函数备忘
    Winsows 服务器,PHP 开发环境搭建
    FuelPHP 查看 Query SQL
    Laravel —— could not find driver
  • 原文地址:https://www.cnblogs.com/CBDoctor/p/2620851.html
Copyright © 2011-2022 走看看