查找数组的第一个和最后一个索引,其中 from 和 to 元素的顺序总和最大
Find the first and last indices of an array for which the sequential sum of elements from and to will be the largest
我有一个整数数组 A [N]。我想找到索引 n 和 m,以便从第 n 个元素到 m 个元素的顺序总和是最大值。搜索时间受 N 值的限制。
这是我的代码:
#include <iostream>
#include <vector>
using namespace std;
int MaxSum(vector<int> &A){
int N=A.size();
int n=0;
int m=0;
int prev_max=A[0];
int sol_max=A[0];
for (int i=1; i<N; i++){
prev_max=max(A[i], A[i]+prev_max);
if (prev_max>=sol_max){
sol_max=prev_max;
}
}
cout<<"m="<<m<<endl;
cout<<"n="<<n<<endl;
// cout<<sol_max<<endl;
}
int main()
{
vector<int> a={{-2},{1},{-3},{4},{-1},{2},{1},{-5},{4}};//for example: n=3; m=6
MaxSum(a);
}
我尝试插入这些计数器,每次程序都无法正常工作,原因很清楚。但是,不幸的是,我不知道如何正确放置它们(我希望你能修复它
这种类型的问题可以使用Kadane算法来解决,并且复杂度是线性的。
这个问题的主要思想是寻找数组的正连续段。并找到所有正连续段之间的最大和。并且还要忽略具有负和的段(因为我们打算找到最大总和(。
注意:如果所有值均为负数,则此想法将失败。要解决此问题,您可以检查所有元素是否都是负数并找到最大值。
int MaxSum(vector<int>&A) {
int n=0,m=0;
int max_so_far=0,max_ending_here=0;
int prevIndex = 0;
for(int i=0;i<A.size();i++) {
max_ending_here += A[i];
if(max_ending_here > max_so_far) {
max_so_far = max_ending_here;
n = prevIndex;
m = i;
}
if(max_ending_here < 0) {
max_ending_here = 0;
prevIndex=i+1;
prevIndex=i+1;
}
}
cout<<"n: "<<n<<endl;
cout<<"m: "<<m<<endl;
}
相关文章:
- Mongodb c++驱动程序:如何查询元素的数组
- "error: no matching function for call to"构造函数错误
- 将数组作为参数传递给函数安全吗?作为第三方职能部门,可以探索他们想要的之外的其他元素
- 使用strcpy将char数组的元素复制到另一个数组
- 使用不带参数的函数访问结构元素
- 给定n个元素的m个集合.在C++中找到出现在最大集合数中的元素
- C++如何通过用户输入删除列表元素
- 调用专用模板时出错"no matching function for call to [...]"
- C++ Singleton - Prevent ::instance() to variable
- lower_bound()返回最后一个元素
- 基于多个条件处理地图中的所有元素
- 调整大小后指向元素值的指针unordered_map有效?
- 使用std::transform将一个范围的元素添加到另一个范围中
- 使用函数"remove"删除重复元素
- 具有最大子序列大小的序列,每个元素都相同
- 如何将两个不同矢量的同一位置的两个元素组合在一起
- 如何将元素添加到数组的线程安全函数?
- 有没有办法将谓词中的元素偏移量传递给 std 算法?
- 我想访问std::unique_ptr中的一个特定元素
- 查找数组的第一个和最后一个索引,其中 from 和 to 元素的顺序总和最大