首页 > 编程语言 >每日OJ题_牛客_相差不超过k的最多数_滑动窗口_C++_Java

每日OJ题_牛客_相差不超过k的最多数_滑动窗口_C++_Java

时间:2024-11-04 23:20:25浏览次数:6  
标签:arr right OJ int ++ C++ 牛客 滑动 left

目录

牛客_相差不超过k的最多数_滑动窗口

题目解析

C++代码

Java代码


牛客_相差不超过k的最多数_滑动窗口

相差不超过k的最多数_牛客题霸_牛客网 (nowcoder.com)

描述:

        给定一个数组,选择一些数,要求选择的数中任意两数差的绝对值不超过 k 。问最多能选择多少个数?

输入描述:

第一行输入两个正整数 n和k。
第二行输入 n 个正整数ai​,用空格隔开,表示这个数组。

输出描述:

一个正整数,代表能选的最多数量。
数据范围:
1≤n≤2×10^5
1≤k,ai≤10^9


题目解析

        排序容易想,但是滑动窗口不容易想到,核心思想:使用滑动窗口算法通过动态调整窗口的大小,遍历所有符合条件的连续子序列,求得最大连续子序列的长度。

C++代码

#include <algorithm>
#include <iostream>
#include <vector>
using namespace std;

int main() // 排序+滑动窗口
{
    int n = 0, k = 0;
    cin >> n >> k;
    vector<int> arr(n);
    for(int i = 0; i < n; ++i)
    {
        cin >> arr[i];
    }
    sort(arr.begin(), arr.end());
    int left = 0, right = 0;
    int res = 1;
    while(right < n)
    {
        while(arr[right] - arr[left] > k)
        {
            ++left;
        }
        res = max(res, right - left + 1);
        ++right;
    }
    cout << res << endl;
    return 0;
}

Java代码

import java.util.*;
// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main
{
    public static void main(String[] args) 
    {
        Scanner in = new Scanner(System.in);
        int n = in.nextInt(), k = in.nextInt();
        int[] arr = new int[n];
        for(int i = 0; i < n; i++)
        {
            arr[i] = in.nextInt();
        }
        Arrays.sort(arr);
        int left = 0, right = 0, ret = 0;
        while(right < n)
        {
            while(arr[right] - arr[left] > k)
            {
                left++;
            }
            ret = Math.max(ret, right - left + 1);
            right++;
        }
        System.out.println(ret);
    }
}

标签:arr,right,OJ,int,++,C++,牛客,滑动,left
From: https://blog.csdn.net/GRrtx/article/details/143486314

相关文章

  • 【c++篇】:深入剖析vector--模拟实现属于自己的c++动态数组
    ✨感谢您阅读本篇文章,文章内容是个人学习笔记的整理,如果哪里有误的话还请您指正噢✨✨个人主页:余辉zmh–CSDN博客✨文章所属专栏:c++篇–CSDN博客文章目录前言一.`vector`类的默认成员函数整体框架构造函数析构函数拷贝构造函数赋值运算符重载函数测试二.`vector`......
  • C++ 逆序乘积式
     题目描述【问题描述】若两个正整数的乘积,等于两正整数各自逆序后的乘积,则称其为逆序乘积式。编写程序读入两个正整数,然后判断这两个正整数能否构成逆序乘积式。假设两个正整数的乘积不会超过int数据类型的表示范围。【输入形式】从控制台输入以一个空格分隔的两个正整数......
  • E-小H学历史(牛客练习赛131)
    题意:现有n座城池,有n-1条道路将这些城池连成树,每座城池可以被两个国家占领,或者是无主,每个国家可以占领和自己城池相连的城池。问两个国家总城池树差最小值是多少。分析:bfs跑A可以占据的所有城池,遇到B停下,假设可以占据a个城池,dfs跑B可以占据的所有城池,遇到A停下,假设可以占据b个......
  • HarmonyOS 开发实践——基于HAR的跨模块C++头文件引用
    ......
  • 牛客软件开发专项练习-Day6
    1.若一个具有N个结点,M条边的无向图构成一个森林,(N>M),则该森林必有多少棵树(N-M)2.某网络的IP地址空间为192.168.5.0/24 , 采用定长子网划分,子网掩码为255.255.255.248,则该网络的最大子网个数 、每个子网内的最大可分配地址个数(32,6)解释:由192.168.5.0/24可知子网掩码是255.......
  • C++ 中类的三大特性是什么?
    封装:封装是将数据和操作数据的方法捆绑在一起,形成一个类。通过封装,类的内部实现细节被隐藏起来,只对外提供公共的接口。这样做有以下几个好处:数据安全性:封装可以防止外部代码直接访问和修改类的内部数据,只能通过类提供的方法进行操作。这样可以保证数据的安全性和完整性,避免因......
  • 算法|牛客网华为机试31-40C++
    牛客网华为机试上篇:算法|牛客网华为机试21-30C++文章目录HJ31单词倒排HJ32密码截取HJ33整数与IP地址间的转换HJ34图片整理HJ35蛇形矩阵HJ36字符串加密HJ37统计每个月兔子的总数HJ38求小球落地5次后所经历的路程和第5次反弹的高度HJ39判断两个IP是否属于同一子......
  • 牛客周赛 Round 66 题解
    牛客周赛Round66题解牛客周赛Round66A-小苯吃糖果_牛客周赛Round66#include<bits/stdc++.h>#defineendl'\n'usingnamespacestd;inta[5];voidsolve(){ for(inti=1;i<=3;i++)cin>>a[i]; sort(a+1,a+4); intans=max(a[1]+a[2],a[3]); cout<......