求子数组的连续最大积---面试精选
2013-11-04 16:50
309 查看
这几天看到这个问题,然后在网上没能找到完整的答案,http://blog.csdn.net/kay_zhyu/article/details/8875031#cpp,作者kay_zhyu给出了不错的思路,而且针对大部分测试时都能给出正确的答案,但是在正负小数比较多时,有些结果不对。
其实质时,忽略了小数相乘时结果越来越小这个结论,当两个小数相乘时,乘积肯定没有当前这个数大,因而我们需要保留当前这个数作为最大的乘积。当然还要感谢kay_zhyu提供的思路。
下面给出完整并且正确的代码:
当然我们使用动态规划的话,那就更容易了,每次维护最大值和最小值,将a[i]乘上去,再更新最大最小值即可。
其实质时,忽略了小数相乘时结果越来越小这个结论,当两个小数相乘时,乘积肯定没有当前这个数大,因而我们需要保留当前这个数作为最大的乘积。当然还要感谢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 ={0.5,0.8,-0.6,0.7,-0.7}; //0.8 //double arr ={2,-0.5,0.7,4,-6};//16.8 //double arr ={-2,3,4,-3,-4};//144 //double arr ={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; }
相关文章推荐
- 笔试面试之求子数组最大和
- 环状连续数组,求子数组最大和
- 编程之美系列之求子数组的连续最大积
- 微软面试100题系列---求子数组的最大和
- 微软等数据结构+算法面试100题(44)-- 求子数组的最大和
- 程序员面试题精选100题(03)-求子数组的最大和
- 微软面试100题之三 求子数组的最大和
- 面试经典(6)--连续子数组最大和--二维
- 面试---求子数组的最大和
- (微软面试100题)求子数组的最大和
- 面试算法(三十一)连续子数组的最大和
- 面试经典-求子数组的最大和
- 微软面试100道之3 求子数组的最大和(数组)
- 面试经典(7)--连续子数组的最大值
- H面试(23):求子数组最大和
- 面试100题:3.求子数组的最大和
- 求子数组最大和 (非连续)(动态规划)
- H面试(23):求子数组最大和
- 微软等面试100题筛选答案-3-求子数组最大和
- 程序员面试题精选(03)-求子数组的最大和