查重类题目,想到用标记数组记录是否出现过
但是最坏情况下可能会从头找到小尾巴,时间复杂度O(n2),数据范围106显然超时
再细看下题目,我们重复进行了寻找是否出现过,干脆把每个元素出现过的次数k记录下来,直接跳到后k个位置,实现O(n)
#include<stdio.h>
#include<string.h>
#include<vector>
using namespace std;
const int maxN = 1100005;
int h[maxN];
int main(){int n, t, l, r, m, temp;vector<int> vi;memset(h, 0, sizeof(h));scanf("%d", &n);for(int i = 0; i < n; i++){scanf("%d", &t);while(h[t] != 0) {temp = t;t += h[t];h[temp]++;}h[t] = 1;vi.push_back(t);}for(int i = 0; i < vi.size(); i++)printf("%d ", vi[i]);return 0;
}