Maximum Product Subarray - LeetCode
2015-11-04 09:47
375 查看
Find the contiguous subarray within an array (containing at least one number) which has the largest product.
For example, given the array
the contiguous subarray
思路:DP。这里我们实际上不需要O(n)的空间,只需要用变量将遍历到的最大值记录下来就可以。
其中,因为求的是数的乘积,有可能原本两个都是负的值相乘后会成为最大的乘积。
因此,我们需要维护两个变量,MaxPre和MinPre。
MaxPre为最后一位是当前位置前一位的区间最大乘积。
MinPre为最后一位是当前位置前一位的区间最小乘积。
之后,将当前位置考虑在内的话,有:
MaxSoFar = max(max(MaxPre * nums[i], MinPre * nums[i]), nums[i]);
MinSoFar = min(min(MinPre * nums[i], MaxPre * nums[i]), nums[i]);
然后用MaxResFound记录下迭代过程中MaxSoFar的最大值,即为结果。
For example, given the array
[2,3,-2,4],
the contiguous subarray
[2,3]has the largest product =
6.
思路:DP。这里我们实际上不需要O(n)的空间,只需要用变量将遍历到的最大值记录下来就可以。
其中,因为求的是数的乘积,有可能原本两个都是负的值相乘后会成为最大的乘积。
因此,我们需要维护两个变量,MaxPre和MinPre。
MaxPre为最后一位是当前位置前一位的区间最大乘积。
MinPre为最后一位是当前位置前一位的区间最小乘积。
之后,将当前位置考虑在内的话,有:
MaxSoFar = max(max(MaxPre * nums[i], MinPre * nums[i]), nums[i]);
MinSoFar = min(min(MinPre * nums[i], MaxPre * nums[i]), nums[i]);
然后用MaxResFound记录下迭代过程中MaxSoFar的最大值,即为结果。
class Solution { public: int maxProduct(vector<int>& nums) { int n = nums.size(); if (n == 0) return 0; int MaxSoFar, MinSoFar, MaxResFound, MaxPre, MinPre; MaxPre = MinPre = MaxSoFar = MinSoFar = MaxResFound = nums[0]; for (int i = 1; i < n; i++) { MaxSoFar = max(max(MaxPre * nums[i], MinPre * nums[i]), nums[i]); MinSoFar = min(min(MinPre * nums[i], MaxPre * nums[i]), nums[i]); MaxResFound = max(MaxResFound, MaxSoFar); MaxPre = MaxSoFar; MinPre = MinSoFar; } return MaxResFound; } };
相关文章推荐
- Java之设计模式【二】
- 【Matlab制作目标切片脚本】
- 在oracle中创建自动增长字段
- 低功耗蓝牙4.0BLE编程-nrf51822开发(7)-SDP服务发现协议
- RMI以及JMS精品教学视频下载 java
- 进度条的实现(线程)
- 配置Windows 2000 Server节点
- WCF 安全机制 客户端和服务端配置文件
- 文章标题
- CGI 编程规范与历史
- Linux集群规划
- Effective C++笔记(六)
- opencv学习篇(3)snake轮廓检测
- 《代码整洁之道》笔记——1整洁代码
- 低功耗蓝牙4.0BLE编程-nrf51822开发(6)-Battery Service
- BSD开源协议是一个给于使用者很大自由的协议
- SerialPort
- 服务端常规知识详解
- arcgis中union、merge、append和intersect区别
- java BigInteger