求子数组的连续最大积---面试精选
来源:互联网 发布:iapp源码 编辑:程序博客网 时间:2024/05/29 19:12
这几天看到这个问题,然后在网上没能找到完整的答案,http://blog.csdn.net/kay_zhyu/article/details/8875031#cpp,作者kay_zhyu给出了不错的思路,而且针对大部分测试时都能给出正确的答案,但是在正负小数比较多时,有些结果不对。
其实质时,忽略了小数相乘时结果越来越小这个结论,当两个小数相乘时,乘积肯定没有当前这个数大,因而我们需要保留当前这个数作为最大的乘积。当然还要感谢kay_zhyu提供的思路。
下面给出完整并且正确的代码:
#include "stdafx.h"#include<iostream>using namespace std;#define Inf 1e5;double GetMaxProduct(double *arr, int nLen) { if(!arr || nLen < 1) return -Inf; if(nLen == 1) return arr[0]; int i; double ans = -Inf; double Nag,Pos; double temp; Nag = Pos = 1; for(i = 0; i < nLen; ++i) { if(arr[i] >= 0.0) { Nag *= arr[i]; Pos *= arr[i]; } else { temp = Nag; Nag = Pos * arr[i]; Pos = temp * arr[i]; }Pos = max(Pos,arr[i]);Nag = min(Nag,arr[i]); ans = max(ans, Pos); if(Nag > 0) Nag = 1; if(Pos < 0) Pos = 1; } return ans; } double max(const double a, const double b) { return a > b ? a : b; }double min(const double a, const double b) { return a < b ? a : b; }int main() { const int N = 30; double arr[N]={0.5,0.8,-0.6,0.7,-0.7}; //0.8//double arr[N]={2,-0.5,0.7,4,-6};//16.8//double arr[N]={-2,3,4,-3,-4};//144//double arr[N]={2,3,4,-5,-6}; double n = GetMaxProduct(arr,5);cout<<n<<endl; return 0;}
当然我们使用动态规划的话,那就更容易了,每次维护最大值和最小值,将a[i]乘上去,再更新最大最小值即可。
double MaxProduct(double* arr, double len) { double dp1 = arr[0]; double dp2 = arr[0]; double largest = arr[0]; for (int i = 1; i < len; ++i) { double tmp1 = dp1*arr[i]; double tmp2 = dp2*arr[i]; dp1 = max(max(tmp1,tmp2),arr[i]); dp2 = min(min(tmp1,tmp2),arr[i]); if(dp1 > largest) largest = dp1; } return largest; }
- 求子数组的连续最大积---面试精选
- 求连续子数组的最大和与最大积
- 求连续子数组的最大和
- 求连续子数组的最大和
- 求连续子数组的最大和
- 求连续子数组的最大和
- 求连续子数组的最大和
- 求连续子数组的最大和
- 求连续子数组的最大和
- 求连续子数组的最大和
- 求连续子数组的最大和
- 求连续子数组的最大和
- 求连续子数组的最大乘积
- 求连续子数组的最大和
- 求连续子数组的最大和
- 求连续子数组的最大和
- 求连续子数组的最大和
- 求连续子数组的最大和
- Java与数据库的连接全教程
- jspsmart实现页面不跳转上传和下载文件(一)
- 如何学习OpenStack,如何成为OpenStack工程师?(转)
- C/C++浮点数在内存中的存储方式
- 文件系统数据(二)——FileStream//20131104
- 求子数组的连续最大积---面试精选
- Oracle drop与purge区别
- 利用/*+Ordered*/提高查询性能
- updatepanel下dropdownlist不能响应selectindexchanged事件的原因(很傻比)
- DownloadManager的使用
- windows下命令行发送邮件 blat.exe 简介
- JQuery TreeGrid 组件详解
- android socket 长连接
- 5个有用的php数组操作函数