子数组的最大乘积

来源:互联网 发布:淘宝孕妇装 编辑:程序博客网 时间:2024/04/29 11:12
题目:给定一个长度为N的整数数组,只允许用乘法,不能用乘法,计算任意(N-1)个数的组合乘积中最大的一组,并写出算法的时间复杂度。
#include "stdafx.h"#include <iostream>using namespace std;#define  INFINITY_MAX 32767#define  INFINITY_MIN -32767void 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;}
复制代码

界面运行如下:

分类: 算法面试
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 孩孑在学校被打怎么办 在学校有人打我怎么办 孩子在学校不爱说话怎么办 孩子上幼儿园不和小朋友玩怎么办 遇到有人要打你怎么办 被表白了怎么办神回复 学校要发展我该怎么办 如果有人要打你怎么办 梦见有人要杀我怎么办 如果有人要杀我怎么办 梦到有人要杀我怎么办 感觉有人要杀我怎么办 我很自卑 没自信怎么办 如果在学校被打怎么办 如果有人打我该怎么办 别人要砍我我怎么办 专四两次没过怎么办 3岁宝宝害羞胆小怎么办 人太老实被欺负怎么办 在外面被欺负了怎么办 同学们老欺负我怎么办 孩子在学校受欺负怎么办 来例假吃了螃蟹怎么办 流产后受风头疼怎么办 种鸽配种无精怎么办 有钱但不舍得花怎么办 黑户急用3万块钱怎么办 和室友闹矛盾了怎么办 型煤炉不好烧是怎么办 生完孩子记性差怎么办 脑子记忆力好差怎么办啊 脸和驴脸一样长怎么办 看3d电影近视眼怎么办 户籍证明不给开怎么办 迁移证过期了6天怎么办 户口迁移证丢了怎么办 地暖找平后开裂怎么办 基膜过期了用了怎么办 花洒底座坏了怎么办 零应力区大于15怎么办 手崴了手腕很疼怎么办