提问者:小点点

如何找到与一系列整数相差最小的两个整数的索引?


我遇到一个问题,要求我打印差值最小的整数的索引。 如果输入是510 12 13 15 10,我必须打印5 1。 问题就在这里。 下面是我的代码:

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main(){
    int n;
    int temp=1005,pos1=0,pos2=0;
    cin>>n;
    vector <int> vec;
    for(int i=0;i<n;i++){
        int in; cin>>in;
        vec.push_back(in);
    }
    for(int i=0;i<n;i++){
        for(int j=1;j<n;j++){
            if(i==j)break;
            int ans=abs(vec[i]-vec[j]);
            cout<<i+1<<"-"<<j+1<<" = "<<ans<<endl;
            if(ans<temp){
                temp=ans;
                pos1=i,pos2=j;
            }
        }
    }

    cout<<pos1+1<<" "<<pos2+1<<endl;
    return 0;
}

共2个答案

匿名用户

士兵们站成一个圆圈,你应该看着挨着站着的士兵。

这意味着您不需要j循环。 您可以简单地将vec[i]vec[(i+1)%n]进行比较。

匿名用户

这是我在C中的解决方案。记住,你只需要关注邻近的元素,并且士兵被组织成一个圆圈。 另外,我发现有点奇怪的是,解决方案要求索引从1开始,而不是从0开始。

#include <stdio.h>

#define ABS(n) ((n) * (((n) > 0) - ((n) < 0)))

void solution(int n, int soldiers[static 2])
{
    int indexA  = 1,
        indexB  = 2,
        minDiff = ABS(soldiers[0] - soldiers[1]),
        heightDiff;
    
    for (int i = 1; i < n; i++)
    {
        if ((heightDiff = ABS(soldiers[i] - soldiers[(i + 1) % n])) < minDiff)
        {
            minDiff = heightDiff;
            indexA = i + 1;
            indexB = ((i + 1) % n) + 1;
        }
    }
    
    printf("%d %d\n", indexA, indexB);
}

int main()
{
    solution(5, (int[5]){10, 12, 13, 15, 10});
    //5 1
    solution(4, (int[4]){10, 20, 30, 40});
    //1 2

    return 0;
}

相关问题