双指针tle求助
  • 板块题目总版
  • 楼主SCAU_Link
  • 当前回复1
  • 已保存回复1
  • 发布时间2023/2/5 17:10
  • 上次更新2023/10/24 01:36:56
查看原帖
双指针tle求助
679327
SCAU_Link楼主2023/2/5 17:10

题目 坏了,我的代码最坏复杂度为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;
}
2023/2/5 17:10
加载中...