【错题集-编程题】空调遥控(二分 / 滑动窗口)

简介: 【错题集-编程题】空调遥控(二分 / 滑动窗口)


一、分析题目

1、滑动窗口

先排序,然后维护窗口内最大值与最小值的差在 2 * p 之间(max - min)。


2、二分查找

先排序,然后枚举所有的温度,⼆分出符合要求的学生区间,然后统计个数。


二、代码

1、滑动窗口(推荐)

//值得学习的代码
//O(NlogN)
#include <iostream>
#include <algorithm>
 
using namespace std;
 
const int N = 1e6 + 10;
 
int n, p;
int arr[N];
 
int main()
{
    cin >> n >> p;
    for(int i = 0; i < n; i++) cin >> arr[i];
    sort(arr, arr + n);
 
    int ret = 0, left = 0, right = 0;
    p *= 2;
 
    while(right < n)
    {
        while(arr[right] - arr[left] > p)
        {
            left++;
        }
        ret = max(ret, right - left + 1);
        right++;
    }
 
    cout << ret << endl;
 
    return 0;
}

2、二分查找

#include <iostream>
#include <algorithm>
using namespace std;
 
const int N=1e6+10;
int a[N];
 
int main()
{
    int n, p;
    cin >> n >> p;
    for(int i = 0; i < n; i++)
        cin >> a[i];
    sort(a, a+n);
    int res=0;
    int mini=a[0], maxi=a[n-1];
    for(int k=mini; k<=maxi; k++)
    {
        int target=max(k-p, 1);
        int left=0, right=n-1;
        while(left<right)
        {
            int mid=left+(right-left)/2;
            if(a[mid]>=target) right=mid;
            else left=mid+1;
        }
        int l=left;
        
        left=0, right=n-1;
        target=k+p;
        while(left<right)
        {
            int mid=left+(right-left+1)/2;
            if(a[mid]<=target) left=mid;
            else right=mid-1;
        }
        res=max(res, right-l+1);
    }
    cout << res << endl;
    return 0;
}

三、反思与改进

我只想到了暴力解法,显示排序,然后确定 K 的范围是在数组 a 中的最大和最小值之间,接着看看有多少学生符合要求。因为是取绝对值,所以我就想着从中间值开始向两边遍历,遇到不符合要求的就可以直接 break 了,然后在所有情况里面取最大值即可,但这样做肯定超过数据范围。在看有多少学生符合要求这里可以进行优化,利用二分来确定符合要求学生的范围,再通过范围即可得出数量。

如果采用滑动窗口的话,这道题的核心就在于需要控制最大值与最小值的差在 2 * p 之间,这个点没有想到。


相关文章
|
Java 算法
JAVA中的Random()函数,获取随机数
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_34173549/article/details/80073531 Java中存在着两种Random函数: 一、java.lang.Math.Random;   调用这个Math.Random()函数能够返回带正号的double值,该值大于等于0.0且小于1.0,即取值范围是[0.0,1.0)的左闭右开区间,返回值是一个伪随机选择的数,在该范围内(近似)均匀分布。
3051 0
|
8月前
|
存储 Java 开发者
【Java】Java中栈溢出的常见情况
【Java】Java中栈溢出的常见情况
92 4
|
Ubuntu 图形学 Linux
Windows10的Ubuntu子系统开启桌面环境
原文:Windows10的Ubuntu子系统开启桌面环境 Ubuntu 优势之一就是桌面环境比较好,所以咱们的子系统当然也不能少了这一环节,本小结开始安装Ubuntu 桌面系统。
2307 0
|
9月前
|
算法
Google Earth Engine(GEE)——地面火灾数据集
Google Earth Engine(GEE)——地面火灾数据集
138 0
|
存储 算法 API
【Zookeeper】源码分析之持久化(一)之FileTxnLog
前一篇已经分析了序列化,这篇接着分析Zookeeper的持久化过程源码,持久化对于数据的存储至关重要,下面进行详细分析。
211 0
【Zookeeper】源码分析之持久化(一)之FileTxnLog
|
9月前
|
编解码 安全 Java
【软件测试】进阶篇 -- 详解
【软件测试】进阶篇 -- 详解
|
9月前
|
存储
【高阶数据结构】图 -- 详解(上)
【高阶数据结构】图 -- 详解(上)
|
9月前
|
设计模式 安全 Java
【Linux 系统】多线程(生产者消费者模型、线程池、STL+智能指针与线程安全、读者写者问题)-- 详解
【Linux 系统】多线程(生产者消费者模型、线程池、STL+智能指针与线程安全、读者写者问题)-- 详解
|
9月前
|
Shell Linux 程序员
【Linux】Shell 命令以及运行原理
【Linux】Shell 命令以及运行原理
|
9月前
|
小程序 Linux 开发工具
【Linux】Linux 开发工具(vim、gcc/g++、make/Makefile)+【小程序:进度条】-- 详解
【Linux】Linux 开发工具(vim、gcc/g++、make/Makefile)+【小程序:进度条】-- 详解

热门文章

最新文章