N个数的数组求N-1个数组合乘积最大的一组
/*
编程之美题,给定N个数的数组,只能使用乘法,不使用除法,找出N-1个数的乘积最大的一组,有两种方法,方法一:采用两个数组分别保存从左向右
和从又向左的两个乘积值,然后在扫描一次,求出最大乘积,空间换时间的方法。
方法二:通过分析这些数的性质,看有多少正数,多少负数,多少0
(1)如果有2个或2个以上的0,则返回0
(2)如果有一个0,则看去除0后的乘积为正数还是负数,如果是负数,最大值为0,返回0(即当有一个0时,看负数奇偶情况,如果负数个数是奇数,则返回0)
,如果是正数,则返回这个正数(即其它所有的乘积)
(3)如果总乘积为负数,则根据负负为正,去除绝对值最小的负数
(4)如果总乘积为正数,则如果存在正数,则除去绝对值最小的正数,否则除去绝对值最大的负数。
因为题目不让用除法,所以不能直接乘出总乘积,然后用除法,所以要一次扫描,记录正数个数,负数个数,绝对值最小正数,绝对值最小的负数,绝对值最大的负数。
*/ #include <iostream>
using namespace std; double maxmultiply(const double *A,int n)
{
if(A==NULL)
return ;
double * left=new double[n];
double * right=new double[n];
left[]=A[];
right[n-]=A[n-];
for(int i=;i<n;i++)
left[i]=left[i-]*A[i];
for(int i=n-;i>=;i--)
right[i]=right[i+]*A[i];
double result=A[];
result=max(left[n-],right[]); //先判断两个边界的时候,后面就不用比较了。
for(int i=;i<=n-;i++)
{
result=max(result,left[i-]*right[i+]);
}
return result;
} /*
方法二,记录正负数个数
*/
double maxmultiply2(const double *A ,int n)
{
if(A==NULL)
return ;
int pos=;
int neg=;
int zero=;
double fabminp=A[]; //绝对值最小的正数
double fabminn=A[]; //绝对值最小的负数
double fabmaxn=A[]; //绝对值最大的负数
double result=;
for(int i=;i<n;i++)
{
if(A[i]==)
zero++;
if(A[i]>)
{
pos++;
if(A[i]<fabminp)
fabminp=A[i];
}
if(A[i]<)
{
neg++;
if(A[i]*(-)<fabminn)
{
fabminn=A[i];
}
if(A[i]*(-)>fabmaxn)
{
fabmaxn=A[i];
}
}
}
if(zero>=)
{
if(zero>=) //有两个以上0,返回0.
return ;
else if((neg&)==) //有一个0,并且负数个数是偶数,说明乘积为正数,返回该正数,必须加括号才行
{
for(int i=;i<n;i++)
{
if(A[i]!=)
result*=A[i];
}
return result;
}
else return ; //有一个0,并且其余乘积为负数,最大为0.
}
else if((neg&)==) //负数个数是偶数(包括0),则总乘积为正,必须加括号才行
{
if(pos>) //如果有正数,则去除最小正数,例如2,3,4,-1,-2,去除2,如果3,-1,-2,则除去3
{
for(int i=;i<n;i++)
{
if(A[i]!=fabminp)
result*=A[i];
}
return result;
}
else //没有正数情况,是偶数个负数,例如-2,-3,-4,-5,去除绝对值最大的负数
{
for(int i=;i<n;i++)
{
if(A[i]!=fabmaxn)
result*=A[i];
}
return result;
}
}
else //负数个数是奇数个,总乘积为负数例如2,3,-1,-2,-3,此时去除绝对值最小的负数,-1
{
for(int i=;i<n;i++)
{
if(A[i]!=fabminn)
result*=A[i];
}
return result;
}
} int main()
{
double A[]={,,-,,,,,,-};
int n=;
cout<<maxmultiply2(A,n)<<endl;
system("pause");
}
N个数的数组求N-1个数组合乘积最大的一组的更多相关文章
- SPOJ Distinct Substrings(后缀数组求不同子串个数,好题)
DISUBSTR - Distinct Substrings no tags Given a string, we need to find the total number of its dist ...
- SPOJ(后缀数组求不同子串个数)
DISUBSTR - Distinct Substrings Given a string, we need to find the total number of its distinct subs ...
- 75 int类型数组中除了一个数出现一次或两次以外,其他数都出现三次,求这个数。[2行核心代码]
[本文链接] http://www.cnblogs.com/hellogiser/p/single-number-of-array-with-other-three-times.html [题目] i ...
- 输入n个数组,数组长度不等,每个数组取出一个数进行组合,求出所有的组合。
转载声明:原文转自http://www.cnblogs.com/xiezie/p/5511707.html 昨天晚上,有个朋友找到我,他在用matlab编程,但是遇到一个问题,解决不了. 问题如下: ...
- 给定两个数组,这两个数组是排序好的,让你求这两个数组合到一起之后第K大的数。
题目:给定两个数组,这两个数组是排序好的,让你求这两个数组合到一起之后第K大的数. 解题思路: 首先取得数组a的中位数a[aMid],然后在b中二分查找a[aMid],得到b[bMid],b[bSt] ...
- CodeForces 702B Powers of Two【二分/lower_bound找多少个数/给出一个数组 求出ai + aj等于2的幂的数对个数】
B. Powers of Two You are given n integers a1, a2, ..., an. Find the number of pairs of indexes i, ...
- 求一个数组的最大k个数(java)
问题描写叙述:求一个数组的最大k个数.如,{1,5,8,9,11,2,3}的最大三个数应该是,8,9,11 问题分析: 1.解法一:最直观的做法是将数组从大到小排序,然后选出当中最大的K个数.可是这种 ...
- POJ 3978 Primes(求范围素数个数)
POJ 3978 Primes(求范围素数个数) id=3978">http://poj.org/problem? id=3978 题意: 给你一个区间范围A和B,要你求出[A,B]内 ...
- 在数组中找几个数的和等于某个数[LeetCode]
首先明确一点,这个方面的问题设计到的知识点是数组的查找的问题.对于类似的这样的查找操作的具体办法就是三种解决方法: 1.暴力算法,多个for循环,很高的时间复杂度 2.先排序,然后左右夹逼,但是这样会 ...
随机推荐
- Mac OSX 安装Python的paramiko模块经验总结
一.简单介绍 最近需要用Python模拟登录远程服务器并自动执行一些代码,需要安装一个叫paramiko的模块. paramiko官方介绍遵循SSH2协议,支持以加密和认证的方式,进行远程服务器的连接 ...
- pycharm3.x 注册码
PyCharm 3.0 注册码 PyCharm3 序列号 License Key 用户名:yueting3527 注册码: ===== LICENSE BEGIN ===== 93347-120420 ...
- Centos 6.2 32位机器安装新的JDK和Weblogic
一.首先卸载自带的JDK 1.查看自带的java版本. root@admin]#java -version java version "1.6.0" OpenJDK Runtime ...
- ColorDialog组件设置字体颜色
1.设置颜色 private void button4_Click(object sender, EventArgs e) { this.colorDialog1.ShowDialog(); this ...
- Js template engine
P http://www.jquery4u.com/javascript/10-javascript-jquery-templates-engines/ http://www.creativebloq ...
- Oracle目录结构及创建新数据库
oracle目录结构 当需要创建新的数据仓库时我可以用 Database Configuration Assistant(数据库配置助手) admin 存放创建的不同数据库 cfgtoollogs c ...
- jquery方法的参数解读
18:22 2013/9/21 attr(name|properties|key,value|fn) 概述 设置或返回被选元素的属性值. 在jquery中[]表示可选参数,你可以不选,| 表示参数可以 ...
- <二> jQuery 语法
通过jQuery你可以选择/查询html元素,并对它们进行操作.jQuery 使用的语法是 XPath 与 CSS 选择器语法的组合. $(this).hide() 隐藏当前html元素 $(&quo ...
- html5判断用户摇晃了手机(转)
先来看下html5的这几个特性: 1.deviceOrientation:方向传感器数据的事件,通过监听该事件可以获取手机静态状态下的方向数据: 2.deviceMotion: 运动传感器数据事件,通 ...
- Spring 配置XML文件头部文件格式
普通格式: <?xml version="1.0" encoding="UTF-8" ?> <beans xmlns:xsi="ht ...