最优化题解 | #相差不超过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的距离。

作为算法的优化,这里应该是极限了,其他就是一些更细碎的了。

全部评论

相关推荐

不愿透露姓名的神秘牛友
11-26 16:06
已编辑
快手电商 后端 23k-35k
点赞 评论 收藏
分享
11-07 13:31
怀化学院 Java
勇敢牛牛不怕难:又疯一个
点赞 评论 收藏
分享
把球:这个听过,你加了就会发现是字节的hr
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务