查找最大乘积子阵列
Find maximum product subarray
我们需要在具有最大乘积的数组(至少包含一个数字(中找到连续的子数组,并返回一个对应于最大可能乘积的整数。 我发现这段代码可以解决相同的问题:
int maxProduct(const vector<int> &A)
{
int n = A.size();
vector<int> maxarray(n);
vector<int> minarray(n);
maxarray[0] = A[0];
minarray[0] = A[0];
int result = A[0];
for(int i=1;i<n;i++){
if(A[i]>0){
maxarray[i] = max(A[i],maxarray[i-1]*A[i]);
minarray[i] = min(A[i],minarray[i-1]*A[i]);
}else{
maxarray[i] = max(A[i],minarray[i-1]*A[i]);
minarray[i] = min(A[i],maxarray[i-1]*A[i]);
}
result = max(result,maxarray[i]);
}
return result;
}
维护一个迷你阵列有什么需要?你能解释一下这些行吗:
if(A[i]>0){
maxarray[i] = max(A[i],maxarray[i-1]*A[i]);
minarray[i] = min(A[i],minarray[i-1]*A[i]);
}else{
maxarray[i] = max(A[i],minarray[i-1]*A[i]);
minarray[i] = min(A[i],maxarray[i-1]*A[i]);
}
为什么我们要像上面的代码行中那样更新 maxarray 和 minarray?
minarray
的目的是处理负数。
{-1, 42, -2}
将返回 42 没有minarray
.
if (A[i]>0){
maxarray[i] = max(A[i], maxarray[i-1]*A[i]);
minarray[i] = min(A[i], minarray[i-1]*A[i]);
} else {
maxarray[i] = max(A[i], minarray[i-1]*A[i]);
minarray[i] = min(A[i], maxarray[i-1]*A[i]);
}
当A[i]
为正时,prev*A[i]
不会改变符号。 要处理的其他情况:当前一个值为 0 时
所以直到索引i
的最大乘积是
A[i]
maxarray[i-1]
是否为 0(或初始化时为负数(maxarray[i-1]*A[i]
别的。
std::max
简化了条件。
同样,最小乘积(最大负数(将std::min(A[i], minarray[i-1] * A[i])
。
当 A[i] 为负数时,prev*A[i]
会改变符号。 所以最大值必须取以前的最小值
maxarray[i] = max(A[i], minarray[i-1] * A[i]);
.
当A[i] == 0
时,最大值和最小值都将0
。(两个分支都很好(。
相关文章:
- 正在查找文档以获得PS4平台的C++中的设备信息
- 在C++中查找文件
- OpenMP阵列性能较差
- 模板元程序查找相似的连续类型名称
- 在UNIX系统中使用DIR查找文件的字节大小
- 查找最接近的大于当前数字的数字的索引
- 有没有一种方法可以创建一个带有哈希表的数据库,该哈希表具有恒定时间查找功能
- 查找后更改类变量
- 查找最大乘积子阵列
- 查找和替换子阵列的最佳方法
- 需要帮助从12个字节生成新的24字节RGB查找阵列,或者是一种更好的编码方法
- 查找随机置换阵列的AVG数量
- 使用双阵列查找模式
- 查找一个阵列包含在另一个C++中的次数
- SIGABRT(信号6)在使用分治法查找阵列中的多数元素时出错
- 查找有效内部圆形内部阵列的索引
- 查找阵列的位置-C
- 用于搜索位阵列以查找连续设置/清除位的快速代码
- 从阵列中查找重复的三维顶点
- 在2D阵列中查找最大的2x2平均值