排队选人-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;
}
相关推荐
xwz小王子1 小时前
手术机器人登上Science Robotics:2毫米纤细手臂,从3厘米切口完成腰椎神经减压
算法·机器人
黎阳之光2 小时前
视频孪生智护供水生命线:黎阳之光赋能医疗与园区水务高质量升级
运维·物联网·算法·安全·数字孪生
Black蜡笔小新3 小时前
自动化AI算法训练服务器DLTM制造业AI质检工作站助力制造业实现AI智检
人工智能·算法·自动化
嵌入式小能手3 小时前
飞凌嵌入式ElfBoard-进程间的通信之命名管道
linux·服务器·算法
啦哈拉哈3 小时前
Leetcode题解记录-hot100(81-100)
算法·leetcode·职场和发展
csdn_aspnet3 小时前
Java 霍尔分区算法(Hoare‘s Partition Algorithm)
java·开发语言·算法
诸葛务农3 小时前
道路行驶条件下电动汽车永磁电机的有效使用寿命及永磁体的失效和回收再利用(下)
java·开发语言·算法
snow@li3 小时前
AI:理解 大数据、算法、算力、电力、生成式AI、token 之间的关系
大数据·人工智能·算法
小智老师PMP4 小时前
零基础能不能考PMP?零基础专属学习路径+全套扶持体系
学习·算法·职场和发展·软件工程·求职招聘·敏捷流程
Dillon Dong4 小时前
【风电控制】FPGA采集Vdc的ADC增益系数解析——从数字码到实际电压的桥梁
算法·fpga开发·变流器·风电控制