C++ 查找C+中最小和连续子数组的起始索引和结束索引+;

C++ 查找C+中最小和连续子数组的起始索引和结束索引+;,c++,kadanes-algorithm,C++,Kadanes Algorithm,我试图找到最小和连续子数组的起始索引和结束索引。我试了很多次,但都找不到。我用C++来做这个。 查找最小和连续子数组的代码: #include <bits/stdc++.h> using namespace std; int main() { int arr[] = {3, -4, 2, -3, -1, 7, -5}; int n = sizeof(arr) / sizeof(arr[0]); int min_ending_here = INT_M

我试图找到最小和连续子数组的起始索引和结束索引。我试了很多次,但都找不到。我用C++来做这个。 查找最小和连续子数组的代码:

#include <bits/stdc++.h> 
using namespace std; 
int main() 
{ 
    int arr[] = {3, -4, 2, -3, -1, 7, -5}; 
    int n = sizeof(arr) / sizeof(arr[0]); 
    int min_ending_here = INT_MAX;  
    int min_so_far = INT_MAX; 
    for (int i=0; i<n; i++) 
    { 
        if (min_ending_here > 0) 
            min_ending_here = arr[i]; 

        else
            min_ending_here += arr[i]; 

        min_so_far = min(min_so_far, min_ending_here);           
    } 
    cout<<"minimum sum = "<<min_so_far; 
}
#包括
使用名称空间std;
int main()
{ 
int arr[]={3,-4,2,-3,-1,7,-5};
int n=sizeof(arr)/sizeof(arr[0]);
int min_end_here=int_MAX;
int min\u so\u far=int\u MAX;
对于(int i=0;i 0)
min_ending_here=arr[i];
其他的
min_ending_here+=arr[i];
min_so_far=min(min_so_far,min_ending_在此);
} 

cout我用两个数组(当前(结果为[1,4])对其进行了测试,并对其进行了注释(结果为[3,3]),请参见代码):

#包括
使用名称空间std;
int main()
{ 
int arr[]={3,-4,2,-3,-1,7,-5};
//int arr[]={2,6,8,1,4};
int n=sizeof(arr)/sizeof(arr[0]);
int min_end_here=int_MAX;
int min\u so\u far=int\u MAX;
int infimum=int_MAX;//保持最小值。
std::pair idx(-1,-1);//子数组的索引
对于(int i=0;i 0)
{
min_ending_here=arr[i];
}
其他的
min_ending_here+=arr[i];
min_so_far=min(min_so_far,min_ending_在此);
//索引添加
if(min_so_far==min_ending_here)
{
下确界=最小值(arr[i],下确界);
if(下确界==arr[i])
{
idx.first=i;
}
idx.second=i;
}

//我用两个数组(当前(结果为[1,4])对其进行了测试,并对其进行了注释(结果为[3,3]),请参见代码:

#包括
使用名称空间std;
int main()
{ 
int arr[]={3,-4,2,-3,-1,7,-5};
//int arr[]={2,6,8,1,4};
int n=sizeof(arr)/sizeof(arr[0]);
int min_end_here=int_MAX;
int min\u so\u far=int\u MAX;
int infimum=int_MAX;//保持最小值。
std::pair idx(-1,-1);//子数组的索引
对于(int i=0;i 0)
{
min_ending_here=arr[i];
}
其他的
min_ending_here+=arr[i];
min_so_far=min(min_so_far,min_ending_在此);
//索引添加
if(min_so_far==min_ending_here)
{
下确界=最小值(arr[i],下确界);
if(下确界==arr[i])
{
idx.first=i;
}
idx.second=i;
}

//假设存在多个具有最小和的连续子数组,我们将采用具有最小起始索引的子数组,我们可以修改上述解决方案,如下所示:

#include <bits/stdc++.h>
using namespace std;
int main() {
   int arr[] = {3, -4, 2, -3, -1, 7, -5};
   int n = sizeof(arr) / sizeof(arr[0]);
   int min_ending_here = INT_MAX;
   int min_so_far = INT_MAX;
   int last_idx = 0; // indication of fresh start of contiguous summation
   int start_idx; // for holding start index
   int end_idx; // for holding end index
   for (int i=0; i<n; i++) {
      if (min_ending_here > 0) {
          min_ending_here = arr[i];
          last_idx = i;
      }
      else {
          min_ending_here += arr[i];
      }
      if (min_so_far > min_ending_here) {
          min_so_far = min_ending_here;
          start_idx = last_idx;
          end_idx = i;
      }
  }
  cout<<"minimum sum = "<<min_so_far<<endl;
  cout<<"start index = "<<start_idx<<endl;
  cout<<"end index = "<<end_idx<<endl;
} 
#包括
使用名称空间std;
int main(){
int arr[]={3,-4,2,-3,-1,7,-5};
int n=sizeof(arr)/sizeof(arr[0]);
int min_end_here=int_MAX;
int min\u so\u far=int\u MAX;
int last_idx=0;//指示连续求和的新开始
int start_idx;//用于保存开始索引
int end_idx;//用于保存结束索引
对于(int i=0;i 0){
min_ending_here=arr[i];
last_idx=i;
}
否则{
min_ending_here+=arr[i];
}
如果(最小值到目前为止>最小值到此结束){
min_so_far=min_ending_在此;
开始\u idx=最后一个\u idx;
end_idx=i;
}
}

cout假设存在多个具有最小和的连续子数组,我们将采用具有最小起始索引的子数组,我们可以修改上述解决方案,如下所示:

#include <bits/stdc++.h>
using namespace std;
int main() {
   int arr[] = {3, -4, 2, -3, -1, 7, -5};
   int n = sizeof(arr) / sizeof(arr[0]);
   int min_ending_here = INT_MAX;
   int min_so_far = INT_MAX;
   int last_idx = 0; // indication of fresh start of contiguous summation
   int start_idx; // for holding start index
   int end_idx; // for holding end index
   for (int i=0; i<n; i++) {
      if (min_ending_here > 0) {
          min_ending_here = arr[i];
          last_idx = i;
      }
      else {
          min_ending_here += arr[i];
      }
      if (min_so_far > min_ending_here) {
          min_so_far = min_ending_here;
          start_idx = last_idx;
          end_idx = i;
      }
  }
  cout<<"minimum sum = "<<min_so_far<<endl;
  cout<<"start index = "<<start_idx<<endl;
  cout<<"end index = "<<end_idx<<endl;
} 
#包括
使用名称空间std;
int main(){
int arr[]={3,-4,2,-3,-1,7,-5};
int n=sizeof(arr)/sizeof(arr[0]);
int min_end_here=int_MAX;
int min\u so\u far=int\u MAX;
int last_idx=0;//指示连续求和的新开始
int start_idx;//用于保存开始索引
int end_idx;//用于保存结束索引
对于(int i=0;i 0){
min_ending_here=arr[i];
last_idx=i;
}
否则{
min_ending_here+=arr[i];
}
如果(最小值到目前为止>最小值到此结束){
min_so_far=min_ending_在此;
开始\u idx=最后一个\u idx;
end_idx=i;
}
}

是什么让你认为
-6
不是正确答案?问题很可能是你输出的是总和而不是索引。-6是正确答案。但是我想找到这个最小和相邻子数组的开始索引和结束索引,所以跟踪当前开始索引和当前结束索引。你的代码显示no尝试获取索引。你能展示你的一个试验吗?此外,最好能引用这段代码的来源:)…是什么让你认为
-6
不是正确的答案?问题很可能是你输出的是总和,而不是索引。-6是正确的答案。但我想找到这段smal的开始和结束索引请跟踪当前开始索引和当前结束索引。您的代码没有显示获取索引的尝试。您可以显示您的一次尝试吗?此外,最好引用此代码的源代码:)…arr[]的错误答案={3,-4,2,-3,-1,-7,-5};您的输出是:minimum sum=-18(sum是正确的)但索引:56(索引是错误的)arr[]={3,-4,2,-3,-1,-7,-5}的错误答案;您的输出是:minimum sum=-18(sum是正确的)但索引:56(索引是错误的)@Vishal Srivastav,如果上述解决方案对您有所帮助,您可以将其标记为已接受,以便在类似问题中帮助未来用户。谢谢!!@Vishal Srivastav,如果上述解决方案对您有所帮助,您可以将其标记为已接受,以便在类似问题中帮助未来用户。谢谢!!