[H双指针] lc1847. 最近的房间(离线算法+数据结构+二分+双指针+平衡树+双周赛51_4)

1. 题目来源

链接:1847. 最近的房间

2. 题目解析

很综合的一道题目,主要算法为 排序+二分+双指针。代码给出的注释已经很完善了。

思路:

  • 将查询数组按照 size,排序,排序后原下标被打乱,故需要记录原有的下标值。开一个结构体记录数据即可。
  • 将房间按照 size 排序。
  • 在查询数组中反向遍历,即按照 size 从大到小的顺序进行遍历,将所有大于 size 加入有序集合 set 中进行维护,从中选择最小的 id 编号。
  • 这样的遍历顺序就能保证,room 越来越小,也就是采用了双指针的思想。
  • set 中运用 lower_bound() 函数可以快速进行二分查找。
  • 最后需要记得将下标还原到答案位置。

  • 时间复杂度 O ( n l o g n ) O(nlogn) O(nlogn)
  • 空间复杂度 O ( n ) O(n) O(n)

代码:

class Solution {
public:
    struct Query {
        int id, p, m;                      // 维护查询的原下标、preferredj、minSizej;
        bool operator< (const Query &t) {  // 按照 minSizej 升序排序
            return m < t.m;
        }
    };

    vector<int> closestRoom(vector<vector<int>>& rooms, vector<vector<int>>& queries) {
        int n = queries.size();
        vector<Query> q;
        for (int i = 0; i < n; i ++ ) 
            q.push_back({i, queries[i][0], queries[i][1]});
        
        sort(q.begin(), q.end());
        sort(rooms.begin(), rooms.end(), [](vector<int> &a, vector<int> &b) {       
            return a[1] < b[1];             // 按照 sizei 排序
        });

        const int INF = 1e9;                // 技巧:保证 set 一定能查找到值,若查到无效值则说明是没找到
        set<int> S{INF, -INF};              // set 维护满足 size 要求的所有 roomid,在其内进行二分查找,lower_bound() 操作
        vector<int> res(n);                 // 直接开 n 大小的答案数组,排序后原查询数组混乱,通过 id 确定原下标
        for (int i = n - 1, j = rooms.size() - 1; ~i; i -- ) {    // 从后往前双指针,rooms size 只会越来越小
            while (~j && rooms[j][1] >= q[i].m) S.insert(rooms[j -- ][0]);  // 满足 size 的 roomid 全部入有序 set 集合
            int p = q[i].p, id = q[i].id;   // 得到每个查询的 preferredj,和原下标
            auto k = S.lower_bound(p);      // 找到满足的大于等于 preferredj 的 roomid
            auto u = k;
            u -- ;                          // 一定是严格小于 p 的那个 id
            if (*k - p >= p - *u) res[id] = *u; // 相等的时候,取小的 id
            else res[id] = *k;              // 否则取大 id
            if (abs(res[id]) == INF) res[id] = -1;  // 找到边界了,为无效值,在 id 位置赋为 -1
        }
        return res;
    }
};
内容概要:本文针对国内加密货币市场预测研究较少的现状,采用BP神经网络构建了CCi30指数预测模型。研究选取2018年3月1日至2019年3月26日共391天的数据作为样本,通过“试凑法”确定最优隐结点数目,建立三层BP神经网络模型对CCi30指数收盘价进行预测。论文详细介绍了数据预处理、模型构建、训练及评估过程,包括数据归一化、特征工程、模型架构设计(如输入层、隐藏层、输出层)、模型编译与训练、模型评估(如RMSE、MAE计算)以及结果可视化。研究表明,该模型在短期内能较准确地预测指数变化趋势。此外,文章还讨论了隐层节点数的优化方法及其对预测性能的影响,并提出了若干改进建议,如引入更多技术指标、优化模型架构、尝试其他时序模型等。 适合人群:对加密货币市场预测感兴趣的研究人员、投资者及具备一定编程基础的数据分析师。 使用场景及目标:①为加密货币市场投资者提供一种新的预测工具和方法;②帮助研究人员理解BP神经网络在时间序列预测中的应用;③为后续研究提供改进方向,如数据增强、模型优化、特征工程等。 其他说明:尽管该模型在短期内表现出良好的预测性能,但仍存在一定局限性,如样本量较小、未考虑外部因素影响等。因此,在实际应用中需谨慎对待模型预测结果,并结合其他分析工具共同决策。
内容概要:该论文针对新型电力系统中非线性负荷和分布式电源接入导致的电能质量扰动识别难题,提出了一种结合优化广义S变换(OGST)和混合输入神经网络的方法。OGST通过自适应选取高斯窗函数参数保留扰动信号的幅值和频率特征;混合输入神经网络分别处理原始时间序列和时频矩阵,融合两种特征后识别扰动类型。实验表明,该方法在26种扰动类型的仿真数据上识别准确率达99.77%,在实际电网信号上达到92.5%,优于传统单一输入神经网络。论文还提供了详细的代码实现,包括优化广义S变换、电能质量扰动信号生成、混合输入神经网络模型构建及训练流程。 适合人群:具备一定编程基础,特别是对电能质量监测、信号处理和深度学习感兴趣的工程师和研究人员。 使用场景及目标:①适用于电力系统中的电能质量监测,特别是智能变电站和新能源电站的并网检测;②通过OGST和混合输入神经网络,提高对复杂电能质量扰动的识别准确率和鲁棒性;③支持实时处理和边缘计算部署,满足工业场景的实时性和资源限制要求。 其他说明:该方法不仅在理论上创新,而且在实际应用中表现出色。通过参数优化和混合输入架构,能够有效应对不同类型的电能质量扰动。此外,论文还提供了完整的代码实现和实验验证,便于读者复现实验结果并应用于实际项目中。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Ypuyu

如果帮助到你,可以请作者喝水~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值