排队选人-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;
}
相关推荐
董董灿是个攻城狮3 小时前
AI视觉连载8:传统 CV 之边缘检测
算法
AI软著研究员10 小时前
程序员必看:软著不是“面子工程”,是代码的“法律保险”
算法
FunnySaltyFish10 小时前
什么?Compose 把 GapBuffer 换成了 LinkBuffer?
算法·kotlin·android jetpack
颜酱11 小时前
理解二叉树最近公共祖先(LCA):从基础到变种解析
javascript·后端·算法
地平线开发者1 天前
SparseDrive 模型导出与性能优化实战
算法·自动驾驶
董董灿是个攻城狮1 天前
大模型连载2:初步认识 tokenizer 的过程
算法
地平线开发者1 天前
地平线 VP 接口工程实践(一):hbVPRoiResize 接口功能、使用约束与典型问题总结
算法·自动驾驶
罗西的思考1 天前
AI Agent框架探秘:拆解 OpenHands(10)--- Runtime
人工智能·算法·机器学习
HXhlx1 天前
CART决策树基本原理
算法·机器学习
Wect1 天前
LeetCode 210. 课程表 II 题解:Kahn算法+DFS 双解法精讲
前端·算法·typescript