题解 | 组队

组队

https://www.nowcoder.com/practice/60c417b02a3b49708dbb634956bb65fe

void solve(){
    int n,k;cin>>n>>k;
    vector<int> a(n+1);
    for(int i=1;i<=n;i++)cin>>a[i];
    sort(a.begin()+1,a.end());
    int r=1;
    int ans=1;
    for(int i=1;i<=n;i++){
        while(r<=n&&a[r]-a[i]<=k)r++;
        ans=max(ans,r-i);
    }
    cout<<ans<<endl;
}

枚举每个数最为选择的最小数x,那么小于等于x+k的数都可以和他一起组队,那么我们可以二分的找到第一个大于x+k的数,即可计算出此时的最大值,比较每个数作为起点时产生的最大值即可知道最终答案,

另外我们发现,将数组排序后, 下标 i 产生的最大值一定小于 小标 i+1产生的最大值,那么我们知道 i 对应的最大值下标 r 后,i+1的最大下标一定在r的右侧,这样维护一个r即可做到在排序后O(n)的遍历 时间复杂度O(nlog(n)+n) O(nlog(n))

全部评论

相关推荐

04-03 09:32
已编辑
华南农业大学 golang
我的代码出BUG了:"晚点发个邮件调整一下时间",你收到新的邮件没,如果没有收到新的邮件,那就需要进入面试链接留痕,否则系统会判定你迟到
点赞 评论 收藏
分享
明明就不饿:看不懂你到底会啥,什么岗位
点赞 评论 收藏
分享
评论
1
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务