C++ 查找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
#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,如果上述解决方案对您有所帮助,您可以将其标记为已接受,以便在类似问题中帮助未来用户。谢谢!!