我有一个整数数组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);
}
我试图插入这些计数器,并且每次程序无法正常运行时,原因很清楚。但是,不幸的是,我不知道如何正确放置它们(希望您可以解决
答案 0 :(得分:0)
可以使用Kadane's Algorithm解决此类问题,并且复杂度是线性的。
此问题的主要思想是寻找数组的正连续段。并在所有正连续段中找到最大和。并忽略具有负总和的段(因为我们打算找到最大和)。
注意:如果所有值均为负,则此方法将失败。要解决此问题,您可以检查所有元素是否都是负数,并找到最大值。
public class MiIntentService extends IntentService {
public static final String ACTION_PROGRESO = "com.example.pruebafirebase.PROGRESO";
public static final String ACTION_FIN = "com.example.pruebafirebase.FIN";
public MiIntentService(){
super("MiIntentService");
}
@Override
protected void onHandleIntent(@Nullable Intent intent) {
////aqui va la tarea larga
int iter = intent.getIntExtra("iteraciones",0);
for(int i = 0 ; i <= iter; i++){
tareaLarga();
//comunicacmos afuera lo de tarea larga
Intent infoIntent = new Intent();
infoIntent.setAction(ACTION_PROGRESO);
infoIntent.putExtra("progreso",i*10);
sendBroadcast(infoIntent);
}
Intent finishIntent = new Intent();
finishIntent.setAction(ACTION_FIN);
sendBroadcast(finishIntent);
}
private void tareaLarga(){
try {
Thread.sleep(10000);
this.stopSelf();
}catch (Exception e){
}
}
}