排队选人-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;
}
相关推荐
sheeta19983 小时前
LeetCode 每日一题笔记 日期:2025.11.24 题目:1018. 可被5整除的二进制前缀
笔记·算法·leetcode
gfdhy8 小时前
【c++】哈希算法深度解析:实现、核心作用与工业级应用
c语言·开发语言·c++·算法·密码学·哈希算法·哈希
百***06019 小时前
SpringMVC 请求参数接收
前端·javascript·算法
weixin_457760009 小时前
Python 数据结构
数据结构·windows·python
一个不知名程序员www10 小时前
算法学习入门---vector(C++)
c++·算法
云飞云共享云桌面10 小时前
无需配置传统电脑——智能装备工厂10个SolidWorks共享一台工作站
运维·服务器·前端·网络·算法·电脑
明洞日记10 小时前
【数据结构手册002】动态数组vector - 连续内存的艺术与科学
开发语言·数据结构·c++
福尔摩斯张10 小时前
《C 语言指针从入门到精通:全面笔记 + 实战习题深度解析》(超详细)
linux·运维·服务器·c语言·开发语言·c++·算法
fashion 道格10 小时前
数据结构实战:深入理解队列的链式结构与实现
c语言·数据结构
橘颂TA10 小时前
【剑斩OFFER】算法的暴力美学——两整数之和
算法·leetcode·职场和发展