使用分而治之的最大总和子数组,为什么要以不同的方式使用 for 循环,答案是错误的?
Maximum Sum Subarray using Divide & Conquer, why use for loop a different way, the answer is wrong?
#include <bits/stdc++.h>
using namespace std;
int MaximumSum(int A[], int low, int high)
{
if (high == low)
return A[low];
int mid = (low + high) / 2;
int leftMax = INT_MIN;
int sum = 0;
for (int i = mid; i >= low; i--)
{
sum += A[i];
if (sum > leftMax)
leftMax = sum;
}
/*
why not write this way? I know when coding like this, answer is wrong.
for (int i = low; i <= mid; i++)
{
sum += A[i];
if (sum > leftMax)
leftMax = sum;
}
*/
int rightMax = INT_MIN;
sum = 0; // reset sum to 0
for (int i = mid + 1; i <= high; i++)
{
sum += A[i];
if (sum > rightMax)
rightMax = sum;
}
int maxLeftRight = max(MaximumSum(A, low, mid),
MaximumSum(A, mid + 1, high));
return max(maxLeftRight, leftMax + rightMax);
}
int main()
{
int arr[] = { -2,1,-3,4,-1,2,1,-5,4 };
int n = sizeof(arr) / sizeof(arr[0]);
cout << "The Maximum sum of the subarray is " <<
MaximumSum(arr, 0, n - 1);
return 0;
}
我的问题是在解决leftMax时,为什么不使用从低到中的for循环,正确版本和错误版本有什么区别,我知道按顺序循环是错误的,但我想知道为什么?我不知道为什么我不能提交...
你想计算中间点的子数组,所以对于左边的部分,你必须从右到左计算。 例如
[5, -42, 2, 0, 1, 2, 3]
零件是
[5, -42, 2, 0] [1, 2, 3]
对于[5, -42, 2, 0]
,从左到右计算给出5
,而从左到右计算给出2
所以包含 0 (mid
( 的子数组总和是
[2, 0] + [1, 2, 3]
顺便说一句,您的算法不是最佳的,它可以以线性复杂性完成。
相关文章:
- 如何以编程方式使窗口全屏显示?
- 使用现代C++在 Eigen3 矩阵上使用 for 循环进行元素操作的优雅方式
- 以编程方式防止重命名或删除文件,但仍使其可写
- 使用分而治之的最大总和子数组,为什么要以不同的方式使用 for 循环,答案是错误的?
- 如何使 printf 以与 NSLog 相同的方式打印字符缓冲区?
- 我可以以某种方式使我的矢量/数组动态更改装置数量吗?
- 如何在 for 循环中取下第一个结果,使其不会重复
- 从for循环中给出最小数字,然后使开关无限
- 如何使用for循环使文件进入下一行
- 为什么这些toupper在这样使用时工作方式不同
- 重载<运算符在另一个类中使用时"no matching function for call"错误
- 逗号(,)在条件部分中两个表达式之间的for循环中的工作方式
- 如何仅使用if-else语句(no-for、do/while等)使此代码循环一定次数?(c++)
- 使 c++ 程序以交互方式将输入输出传递给 windows 命令 prommpt
- 以旧方式C++遍历对象指针数组(没有基于范围的 for)
- 这个 for 循环在做什么,可以以不同的方式编写它
- std::vector push_back 在并行 for 循环中使用时失败
- 是否可以以这种方式定义 for 循环
- 告诉 PDCurses 以编程方式使窗口与物理屏幕大小相同的方法
- 如何以编程方式使系统崩溃