最优化题解 | #相差不超过k的最多数#
相差不超过k的最多数
https://www.nowcoder.com/practice/562630ca90ac40ce89443c91060574c6
#include <stdio.h>
#include <iostream>
#include <algorithm>
using namespace std;
int num[200005];
int main() {
int n,k;
int head, tail;
cin >> n >> k;
for(int i=0; i<n; i++) {
scanf("%d", num+i);
}
sort(num, num+n);
for(head=0, tail=0; tail<n; tail++) { //关键的最优就在这个循环
if(num[tail] - num[head] > k) head++;
}
cout << tail-head << endl;
return 0;
}
这里我们可以知道tail-head一定是最大值,粗略证明如下:
最大值一定存在,当时tail和head一定相对应。
之后tail和head的差距将一直保持不变,因为条件(num[tail] - num[head] > k)一直被满足,所以head和tail同时加。
这里之所以不是tail-head+1,因为在循环的最后tail直接等于了n,相当于把这个1加上了。
通过这个方法,我们就省去了和最大值比较的过程,两个下标的总移动距离也有一点缩小,即变为2*n-最大差,而不是一般算法的2*n-与末尾相差k的距离。
作为算法的优化,这里应该是极限了,其他就是一些更细碎的了。
查看14道真题和解析