zoukankan      html  css  js  c++  java
  • 子数组的最大乘积

    题目:给定一个长度为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;
    }

    界面运行如下:

  • 相关阅读:
    BootstrapValidator验证规则、BootStrap表格:列参数
    使用JSONObject解析和生成json
    java.Math类常用方法
    Java内存溢出处理
    windows下Ubuntu虚拟机联网配置 + Ubuntu虚拟机代理配置
    C# 获取并判断操作系统版本,解决Win10、 Windows Server 2012 R2 读取失败的方案
    C++ 获取并判断操作系统版本,解决Win10、 Windows Server 2012 R2 读取失败的方案
    asp.net 程序,当发生找不到文件的错误时,如何正确定位是哪个文件?
    MVC 网站部署常见问题汇总
    ASP.NET windows验证IIS配置
  • 原文地址:https://www.cnblogs.com/venow/p/2672049.html
Copyright © 2011-2022 走看看