题目来源:牛客网
思路:将数据从小到大排序,选择满足条件的最长连续序列即可。
方法一:两层for循环
#include<iostream>
#include<algorithm>
using namespace std;
int a[200010];
int main() {
int n, k;
cin >> n >> k;
int ans = 1;
for (int i = 0; i < n; i++)cin >> a[i];
sort(a, a + n);
for (int i = 0; i < n - 1; i++) {
for (int j = i + 1; j < n; j++) {
if (a[j] - a[i] > k) {
ans = max(ans, j - i);
break;
}
if (j == n - 1 && a[j] - a[i] <= k) {
ans = max(ans, j - i + 1);
}
}
cout << ans;
return 0;
}
提交该代码会提示运行超时,这是因为该算法的时间复杂度为O(n²),n最大可取,而题目的时间限制为1s。n最大可取时O(n²)的时间复杂度不能在1s内运行结束。
方法二:双指针
#include<iostream>
#include<algorithm>
using namespace std;
int a[200010];
int main() {
int n, k;
cin >> n >> k;
int ans = 1;
for (int i = 0; i < n; i++)cin >> a[i];
sort(a, a + n);
int l = 0, r = 0;
while (r < n) {
if (a[r] - a[l] > k) {
ans = max(ans, r - l);
l++;
}
if (r == n - 1 && a[r] - a[l] <= k) {
ans = max(ans, r + 1 - l);
}
r++;
}
cout << ans;
return 0;
}
此时算法的时间复杂度取决于排序函数sort()的时间复杂度O(nlog n)。
上述代码中的while循环也写成下述代码:
while (r < n) {
if (a[r] - a[l] > k) {
l++;
}
ans = max(ans, r + 1 - l);
r++;
}