坏了,我的代码最坏复杂度为n^2,因为j会回溯到i。
求大佬讲讲怎么改进
#include <iostream>
#include <algorithm>
using namespace std;
int n, a[100010], i, j, x, k, ans, t;
int main()
{
cin >> n >> x >> k;
for (i = 1; i <= n; ++i) cin >> a[i];
sort(a + 1, a + n + 1);
for (i = 1, j = 1; i <= n && j <= n;)
{
t = a[j] / x - a[i] / x; if (a[i] % x == 0) t++;//(i,j)区间满足条件的数量为a[j]/x减去a[i]/x,如果a[i]%x==0,数量+1
if (t == k)
{
int z = 1; if (a[i] == a[j] && i != j) z = 2;//满足条件且i != j,两数相等
if (j == n && i < n) ans += z, i++, j = i;
else if (j < n)ans += z, j++;
else if (j == n && i == n)
{
ans += z; break;
}
}
else if (t < k) j++;
else if (t > k) i++, j = i;
}
cout << ans;
return 0;
}