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;
    }

    界面运行如下:

  • 相关阅读:
    jQuery插件开发入门
    [转]JS学习总结-技巧、方法、细节
    JS无法获取display为none的隐藏元素的宽度和高度的解决方案
    vuejs2.0运用原生js实现简单的拖拽元素功能
    HTML5效果:Canvas 实现圆形进度条并显示数字百分比
    git常用命令总结以及用github来展示你的前端页面
    jQuery 对AMD的支持(Require.js中如何使用jQuery)
    vue+springboot上传和下载附件功能
    springboot+vue实现文件上传
    Spring boot+Vue全栈开发---Spring Boot文件上传
  • 原文地址:https://www.cnblogs.com/venow/p/2672049.html
Copyright © 2011-2022 走看看