题解 | 【模板】双指针

【模板】双指针

https://www.nowcoder.com/practice/a2fd81391e1e4177aa6d506da895381b

#include <iostream>
#include <unordered_map>
#include <vector>
using namespace std;

    // 所谓两两相同,人话就是滑动窗口内不能出现相同的元素
    // 难点:左指针如何快速移动到当前窗口内与右指针所指元素相同的元素下标处?
    // 解决方法:使用哈希表统计窗口内所有元素的出现次数,如果发现右指针元素次数大于1。
    // 那么就让左指针不断向右进一位,直到右指针元素的出现次数重新变成1(实在妙不可言)
    // 注意这一过程实时把左指针处的哈希值减1,更新一下
int main() {
    int n;
    cin >> n;
    
    vector<int> a(n);
    for (int i = 0; i < n; i++) {
        cin >> a[i];
    }
    unordered_map<int, int> map; // 创建哈希表存储已出现的元素的出现次数
    int l = 0, max_len = 0, curr_len = 0;
    vector<pair<int, int>> result; // 存储最大长度的区间lr值

    for (int r = 0; r < n; r++) {
        map[a[r]] ++; 
        while (map[a[r]] > 1) { // 出现两次了,不满足两两相等
            map[a[l]]--; // 左指针右移时,它的元素的哈希值肯定也变小
            if (map[a[l]] == 0) {
                map.erase(a[l]); //键对应值为0,直接抹去,节省哈希表内存
            }
            l++;
        }
        curr_len = r - l + 1; // 得到当前窗口长度
        if (curr_len > max_len) {
            result.clear();
            result.emplace_back(l+1, r+1);
            // emplace比push在非平凡类型上效率更高
            max_len = curr_len; // 更新最大长度
        }
        else if (curr_len == max_len) {
            result.emplace_back(l+1, r+1);
        }
    }

    cout << result.size() << '\n';
    for (auto & i : result) {
        cout << i.first << " " << i.second << '\n';
    }
    return 0; // 蓝桥杯要求主函数return 0,我们要养成好习惯
}

// 学到的新语法技巧:
// 1、对于要一次性存入l,r,不仅可以创建结构体数组,更可以创建pair数据类型的数组
// (利用pair存2的特性,实际操作时记得补上 {} )
// 2、对于既要输出最大长度,又要输出最大长度的区间,区间这一块当存在更大的长度时,
// 我直接把数组清空,result.clear(),然后把更长的区间lr存进去,非常省事
// 3、哈希表也需要注意内存维护,当某个键的值为0,及时将其.erase(a[i]),节省内存

全部评论

相关推荐

合适才能收到offe...:招聘上写这些态度傲慢的就别继续招呼了,你会发现hr和面试官挺神的,本来求职艰难就可能影响一些心态了,你去这种公司面试的话,整个心态会炸的。
点赞 评论 收藏
分享
评论
1
收藏
分享

创作者周榜

更多
正在热议
更多
# 春招至今,你的战绩如何? #
11099次浏览 95人参与
# 你的实习产出是真实的还是包装的? #
1960次浏览 42人参与
# 巨人网络春招 #
11373次浏览 223人参与
# 军工所铁饭碗 vs 互联网高薪资,你会选谁 #
7644次浏览 43人参与
# 简历第一个项目做什么 #
31750次浏览 341人参与
# 重来一次,我还会选择这个专业吗 #
433557次浏览 3926人参与
# MiniMax求职进展汇总 #
24125次浏览 309人参与
# 当下环境,你会继续卷互联网,还是看其他行业机会 #
187217次浏览 1122人参与
# 牛客AI文生图 #
21452次浏览 238人参与
# 不考虑薪资和职业,你最想做什么工作呢? #
152461次浏览 888人参与
# 研究所笔面经互助 #
118967次浏览 577人参与
# 简历中的项目经历要怎么写? #
310376次浏览 4219人参与
# AI时代,哪些岗位最容易被淘汰 #
63853次浏览 828人参与
# 面试紧张时你会有什么表现? #
30516次浏览 188人参与
# 你今年的平均薪资是多少? #
213147次浏览 1039人参与
# 你怎么看待AI面试 #
180154次浏览 1258人参与
# 高学历就一定能找到好工作吗? #
64334次浏览 620人参与
# 你最满意的offer薪资是哪家公司? #
76547次浏览 374人参与
# 我的求职精神状态 #
448145次浏览 3129人参与
# 正在春招的你,也参与了去年秋招吗? #
363530次浏览 2638人参与
# 腾讯音乐求职进展汇总 #
160683次浏览 1112人参与
# 校招笔试 #
471238次浏览 2964人参与
牛客网
牛客网在线编程
牛客网题解
牛客企业服务