• 子数组的最大乘积


    题目:给定一个长度为N的整数数组,只允许用乘法,不能用乘法,计算任意(N-1)个数的组合乘积中最大的一组,并写出算法的时间复杂度。

    答:

    #include "stdafx.h"
    #include <iostream>
    
    using namespace std;
    
    #define  INFINITY_MAX 32767
    #define  INFINITY_MIN -32767
    
    void PrintSubArray(int *arr, int length, int key)
    {
        bool first = true;
        for (int i = 0; i < length; i++)
        {
            if (first && arr[i] == key)
            {
                first = false;
            }
            else
            {
                cout<<arr[i]<<"  ";
            }
        }
        cout<<endl;
    }
    
    //子数组的最大乘积
    void FindMaxValueOfSubArray(int *arr, int length)
    {
        if (NULL == arr || length <= 0)
        {
            return;
        }
    
        int negativeCount = 0;
        int zeroCount = 0;
        int minPlusNumber = INFINITY_MAX;
        int maxNegativeNumber = INFINITY_MIN;
        for (int i = 0; i < length; i++)
        {
            if (arr[i] > 0)     //1、求正数的最小值       
            {
                if (minPlusNumber > arr[i])
                {
                    minPlusNumber = arr[i];
                }
            }
            else if (arr[i] < 0)                      //2、求负数的最大值,并且计算负数的个数     
            {
                if (maxNegativeNumber < arr[i])
                {
                    maxNegativeNumber = arr[i];
                }
                negativeCount++;
            }
            else                                     //3、计算0的个数     
            {
                zeroCount++;
            }
        }
        if (zeroCount > 1)                         //如0的个数大于1个,则子数组的乘积为0,子数组组合有很多种
        {
            cout<<"子数组的最大乘积为:0"<<endl;
        }
        else if (zeroCount == 1 && negativeCount % 2 == 1)  //如0的个数为1个,且负数个数为奇数,则子数组的最大乘积为0,子数组组合有很多种
        {
            cout<<"子数组的最大乘积为:0"<<endl;
        }
        else if (zeroCount == 1 && negativeCount % 2 == 0)  //如0的个数为1个,且负数个数为偶数,子数组组合为去掉0元素的那组
        {
            cout<<"子数组的组合为:"<<endl;
            PrintSubArray(arr, length, 0);
        }
        else if (negativeCount % 2 == 1)   //没有0元素,且负数个数为奇数,子数组组合为去掉最大负数的那组
        { 
            cout<<"子数组的组合为:"<<endl;
            PrintSubArray(arr, length, maxNegativeNumber);
        }
        else if (negativeCount % 2 == 0)  //没有0元素,且负数个数为偶数,子数组组合为去掉最小正数的那组
        {
            cout<<"子数组的组合为:"<<endl;
            PrintSubArray(arr, length, minPlusNumber);
        }
    }
    
    int _tmain(int argc, _TCHAR* argv[])
    {
        int arr[] = {1, 2, 3, 4, 5 ,6 ,-7, -8, -9, 10};
        FindMaxValueOfSubArray(arr, sizeof(arr)/sizeof(arr[0]));
    
        cout<<endl;
        return 0;
    }

    界面运行如下:

  • 相关阅读:
    Python 流媒体播放器(基于VLC)转载
    从2011年用工荒现象看中国人口结构的周期波动
    软件供应链安全现状分析
    vue中this.$nextTick()的用法
    C#中几种数据格式保存xls(DataTable 和List 保存xls) DataGridView转DataTable
    element 报错:Unexpected reserved word 'await'
    C# winfrm程序的主入口捕获项目的全部异常
    利用C#怎么获取 List集合中的重复值Linq操作
    cesium 自定义时间轴 通过改变时间设置光照效果[转]
    CESIUM 原理 之 COMMAND拼接【转】
  • 原文地址:https://www.cnblogs.com/venow/p/2672049.html
Copyright © 2020-2023  润新知