排队选人-2024年秋招-小米集团-软件开发岗-第二批笔试

题目分析:区间极值问题(极小值),此题目长度为k的区间极小值不能小于a。

区间极值问题有三种方法:

(1)序列中元素的值可变,线段树(已忘记怎么写)。

(2)序列中元素不可变,RMQ数组

(3)此题目由于区间长度固定为k,且仅为小米招聘算法第一题,因此使用数据结构课程中的set结构来解决。set简单说就是一个有序集合,我们用set存储一个长度为k区间所有元素,区间向后移动时删除最左侧元素,加入最右侧元素。

小提示:此处可能有重复元素,因此使用multiset结构,另外set集合最小值用begin()函数可得。

使用set结构需要注意,最大值是end()函数前驱,所以需要指针前移,也就是--sa.end()才是最大元素.

cpp 复制代码
#include <bits/stdc++.h>
using namespace std;
int main()
{
    int n,k,a,b,i,j,x,d1[100005]={0},d2[100005]={0},ans=0;
    cin>>n>>k>>a>>b;
    for(i=1;i<=n;i++)
       cin>>d1[i];
    for(i=1;i<=n;i++)
       cin>>d2[i];
    multiset<int> sa,sb;
    for(i=0;i<k;i++)/**< 此处多放了1个零进去 */
        sa.insert(d1[i]),sb.insert(d2[i]);
    for(i=k;i<=n;i++)
    {/**< 集合中保持k个元素,放入第i个,拿走第i-k个*/
        sa.erase(d1[i-k]);
        sb.erase(d2[i-k]);
        sa.insert(d1[i]);
        sb.insert(d2[i]);
        if(*sa.begin()>=a&&*sb.begin()>=b)
            ans++;/**< 集合中begin()获取最小值,end()获取最大值 */
    }
    cout<<ans;
    return 0;
}
相关推荐
Peregrine917 分钟前
C++ - > 类和对象
java·c++·算法
Gigavision1 小时前
DEAP数据集 2026最新Transformer算法 DEAP 数据集 下载
深度学习·算法·transformer
夜之眷属2 小时前
PriorityQueue:for-each 遍历和 poll 取出,顺序一样吗?
java·服务器·数据结构·后端·算法
思维新观察2 小时前
三星 Galaxy Tab S12 系列:大屏 AI 平板,兼顾轻薄与生产力
数据结构·人工智能·电脑
地平线开发者2 小时前
不是线程越多越快:用 hrt_model_exec 在 征程6M 上给 YOLOv5x 建立性能基线
算法
姜鱼问生3 小时前
fail2ban 实战:从默认配置到生产可用
后端·算法·架构
垆边人似月.3 小时前
华为题:全排列
算法·深度优先·图论
杜 硕3 小时前
快速排序详解01
数据结构·算法·排序算法
Matlab程序猿3 小时前
【MATLAB源码-第459期】基于matlab的D-H模型与阻尼最小二乘逆运动学的六自由度机械臂五次轨迹规划及动力学前馈PD控制仿真。
人工智能·算法·matlab·d-h建模·六自由度串联机械臂
信奥卷王3 小时前
[GESP202606 六级] 满二叉树
数据结构·算法