排队选人-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;
}
相关推荐
郝学胜-神的一滴15 分钟前
Leetcode 969 煎饼排序✨:翻转间的数组排序艺术
数据结构·c++·算法·leetcode·面试
I_LPL8 小时前
hot100贪心专题
数据结构·算法·leetcode·贪心
颜酱8 小时前
DFS 岛屿系列题全解析
javascript·后端·算法
WolfGang0073218 小时前
代码随想录算法训练营 Day16 | 二叉树 part06
算法
2401_8318249610 小时前
代码性能剖析工具
开发语言·c++·算法
Sunshine for you10 小时前
C++中的职责链模式实战
开发语言·c++·算法
qq_4160187211 小时前
C++中的状态模式
开发语言·c++·算法
2401_8845632411 小时前
模板代码生成工具
开发语言·c++·算法
2401_8319207411 小时前
C++代码国际化支持
开发语言·c++·算法
m0_6727033111 小时前
上机练习第51天
数据结构·c++·算法