【问题标题】:I have to find the index of the first repeating element in an array in C++我必须在 C++ 中找到数组中第一个重复元素的索引
【发布时间】:2022-01-16 08:03:28
【问题描述】:

我不打算在这里使用任何数据结构,因为我对它们一无所知。所以我只使用数组......在这种方法中,时间复杂度降低到 O(n),并且算法类似于散列......有点......所以问题很简单,它没有运行。它根本没有在我的 VS 代码中运行。我还尝试了在线 C++ 编译器,我给出的每个输入的输出都为 1。发生了什么?

#include <iostream>
#include <climits>
using namespace std;

int main()
{
    int n;
    cin>>n;
    int array[n];
    for(int i=0;i<n;i++){
        cin>>array[i];
    }
    
    
    
    const int N=1e6+2;
    int idx[N];
    for(int i=0;i<N;i++){
        idx[i]=-1;
    }
    
    
    int min_index=INT_MAX;
    for(int i=0;i<n;i++){
        if(idx[array[i]]==-1){
            idx[array[i]]=i;
        }
        else{
            min_index=min(min_index,idx[array[i]]);
        }
    }
    cout<<min_index<<endl;
    return 0;
}

【问题讨论】:

  • 只计算你的值,当你第二次计算一个值时会中断。
  • 只需将当前项与下一项进行比较,如果相同则返回索引
  • 附带说明 - 当n 不是编译时间常数时,int array[n];not standard C++
  • 数组没有排序,所以我们不能只比较当前元素和下一个元素
  • 不运行是什么意思?编译运行有困难吗?

标签: c++ arrays loops hashmap


【解决方案1】:
#include <iostream>
#include <climits>
using namespace std;

int main()
{
    int n;
    cin>>n;
    int array[n];
    for(int i=0;i<n;i++){
        cin>>array[i];
    }
    
    
    
    const int N=1e6+2;
    int idx[N];
    for(int i=0;i<N;i++){
        idx[i]=-1;
    }
    
    
    int min_index=INT_MAX;
    for(int i=0;i<n;i++){
        if(idx[array[i]]==-1){
            idx[array[i]]++;
        }
        else{
            cout << i<<endl;
            break;
        }
    }
    return 0;
}

虽然这不是最好的方法,因为会浪费内存而不是大小为 N 的数组,但您可以使用 unordered_map 或 set

【讨论】:

猜你喜欢
  • 2018-11-07
  • 2021-10-27
  • 2021-08-23
  • 2018-04-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多