找到一个数组的第一个和最后一个索引,其元素从和到的顺序总和最大

时间:2019-09-15 18:12:39

标签: c++ arrays counting

我有一个整数数组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);
}

我试图插入这些计数器,并且每次程序无法正常运行时,原因很清楚。但是,不幸的是,我不知道如何正确放置它们(希望您可以解决

1 个答案:

答案 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){

    }

   }
  }