Find the contiguous subarray within an array (containing at least one number) which has the largest product.

For example, given the array [2,3,-2,4],the contiguous subarray [2,3] has the largest product = 6.

看到这道题,很明显的一套动态规划类型的题目,和最长升序子序列之类的十分类似,那么首先就是想递推公式。

思路①:

subarray[i][j]表示数组中从第 i 到第 j 位置的数字组成的子数组的乘积。因此我们有如下递推公式:

subarray[i][j] = subarray[i][j-1] * array[j]

很显然,这种做法需要一个二重循环,时间复杂度是O(n^2)

思路②:

因为考虑到,最大的一个子数组最大乘积可以分为两种情况:

A.之前的子数组乘积为负,当前的数字也为负,相乘为一个大正数

B.之前的子数组乘积为正,当前的数字也是正,相乘为一个正数

考虑到上面的两种情况,因此我们需要保存两个数组,分别记录当前的最大正整数乘积和最小负整数乘积

positive_subarray[i]:表示数组前i个数之前的最大相乘正值(包括第 i 个数)

negative_subarray[i]:表示数组前i个数之前的最大相乘负值(包括第 i 个数)

所以有:

当array[i] >= 0 时:

positive_subarray[i] = max( positive_subarray[i-1]*array[i], array[i] )

negative_subarray[i] = negative_subarray[i-1]*array[i]

当array[i] < 0 时:

positive_subarray[i] = negative_subarray[i-1]*array[i]

negative_subarray[i] = min( positive_subarray[i-1]*array[i], array[i])

这样程序的复杂度就降低到了O(n)

代码如下:

int  maxProduct(vector& nums)
{
  if(nums.empty())
    return 0;
  vector positive_subarray = vector(nums.size(),0);
  vector negative_subarray = vector(nums.size(),0);
  int max_product;
  int len = nums.size();
  if(nums[0] < 0)
    negative_subarray[0] = nums[0];
  else
    positive_subarray[0] = nums[0];
  max_product = nums[0];
  for(int i=1;i
  {
    if(nums[i]>=0)
    {
      positive_subarray[i] = max(positive_subarray[i-1]*nums[i],nums[i]);
      negative_subarray[i] = negative_subarray[i-1]*nums[i];
    }
    else
    {
      positive_subarray[i] = negative_subarray[i-1]*nums[i];
      negative_subarray[i] = min(positive_subarray[i-1]*nums[i],nums[i]);
    }
    if(positive_subarray[i]>max_product)
      max_product = positive_subarray[i];
  }
  return max_product;
}

  

最新文章

  1. 开发微信App支付
  2. java类,接口浅谈
  3. angular ng-repeat+sortable 拖拽demo
  4. iOS开发小技巧--根据文字,计算label中文字高度
  5. Java_一致性哈希算法与Java实现
  6. php请求URL中的参数有空格
  7. Objective-C( 语法一)
  8. 正则表达式中参数g、i、m的作用(share)
  9. Web serviser请求通道在等待 00:00:59.6479648 以后答复时超时。增加传递给请求调用的超时值,或者增加绑定上的 SendTimeout 值。分配给此操作的时间可能是更长超时的一部分。
  10. 数据结构———KMP
  11. ThinkPHP第二十四天(JQuery常用方法、TP自动验证)
  12. Java线程:线程中断
  13. 期望$DP$ 方法总结
  14. python迭代-如何实现反向迭代
  15. wamp安装运行时出现服务未启动
  16. [2017-7-26]Android Learning Day4
  17. Oracle数据库SQLPLUS 连接显示 ??? 的解决
  18. zoj 3659 第37届ACM/ICPC 长春赛区现场赛E题 (并查集)
  19. c语言统计程序执行时间
  20. IEdevelopToolbar ie浏览器的css代码调试工具

热门文章

  1. Cross join in excel --- Copy from Internet
  2. Source Insight下提示未完整安装的问题
  3. winform 获取当前程序运行根目录
  4. JavaScript之ES6
  5. 在Mac OS X 下快速安装Nginx
  6. JsonProperties对模型返回的应用
  7. Open Close Principle 开闭合原则
  8. Trace-语句启动Profiler中暂停的跟踪会出现什么状况
  9. 优化phpstorm运行卡顿问题!
  10. sql 中convert和cast区别