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

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


一、分析题目

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 之间,这个点没有想到。


相关文章
|
1月前
【每日一题Day327】LCP 50. 宝石补给 | 模拟
【每日一题Day327】LCP 50. 宝石补给 | 模拟
30 0
|
8月前
|
算法 测试技术 图计算
|
11月前
|
存储 机器人 C++
leetcode 每日一题 874. 模拟行走机器人 c++模拟解法
简单来说就是机器人在一个矩阵上移动 我们要找到一个离原点的一个最大欧式距离的平方
103 0
|
测试技术
Leecode 42. 接雨水
Leecode 42. 接雨水
71 1
洛谷P1135 奇怪的电梯——广搜
洛谷P1135 奇怪的电梯——广搜
76 0
|
算法 C++ Python
【每日算法Day 61】LeetCode 672. 灯泡开关 Ⅱ
【每日算法Day 61】LeetCode 672. 灯泡开关 Ⅱ
|
存储 算法 JavaScript
双指针解决【接雨水】问题
本篇将带来双指针算法经典题目之:接雨水问题;
|
机器人
UPC—— 最勇敢的机器人(并查集+分组背包)
UPC—— 最勇敢的机器人(并查集+分组背包)
61 0
|
存储 算法 机器人
【算法刷题】—7.14模拟,数组螺旋输出,机器人走路
✨今日算法三题 1.二进制求和 2.螺旋矩阵 3.模拟行走机器人
【算法刷题】—7.14模拟,数组螺旋输出,机器人走路