数组中的最长连续子序列

数组中的最长连续子序列_牛客题霸_牛客网

思路:将给出的数按顺序排序,然后按顺序计算,如果前后差值为1,开始迭代计数,然后与最大值比较,如果大于就更新。时间复杂度要求O(NlogN)。1.可以使用set,set自带去重和排序功能,十分适合做本题。set底层为红黑树,建成一个树的时间复杂度为O(NlogN),空间复杂度为O(N),不过由于是结点,所以系数肯定会大一些;

也可以用另一种set的构造函数:

2.还有一种方法,先用sort对给定的数组进行排序,再用unique函数去重,然后再用erase函数删除无效数据,就达到了与set一样的效果,并且空间消耗要小一些,时间复杂度也是O(NlogN)。这里着重看一下unique的用法

std::unique 是 C++ STL <algorithm> 里的函数,用于 去除相邻的重复元素 ,只保留每个元素第一次出现的位置,并返回新逻辑末尾迭代器。它不会真正删除元素,只是将重复内容移动到后面 。要真正删除,需要配合 erase()

复制代码
#include <algorithm>
#include <vector>
#include <iostream>
using namespace std;

int main() {
    vector<int> v = {1, 1, 2, 2, 2, 3, 3, 4};

    auto last = unique(v.begin(), v.end());
    v.erase(last, v.end()); // 真的删除重复部分

    for(int x : v) cout << x << " ";
}

输出:

复制代码
1 2 3 4

只处理相邻重复

如果元素不连续,unique 不会帮你排序或去重:

复制代码
vector<int> v = {3, 1, 2, 1, 2};
unique(v.begin(), v.end()); // 没有作用,因为相邻元素没重复

所以常见用法是:

复制代码
sort + unique

重载支持自定义比较

复制代码
unique(v.begin(), v.end(), [](int a, int b){
    return abs(a - b) < 3; // 自定义"相等"规则
});

返回值

内容 解释
返回迭代器 指向去重后"逻辑有效区间的末尾"
原容器长度不变 只是元素被移动,末尾部分无意义

举个例子看一看unique的过程:

1222344

复制代码
索引:   0 1 2 3 4 5 6
数据:   1 2 2 2 3 4 4

设:

复制代码
write = 0
read  = 1

规则:

  • 如果 v[read] != v[write] → 表示新值,把它写进 write+1 位置,并 write++

  • 如果相等 → 跳过

步骤 read write 判断 修改后数组(带解释)
初始 1 0 --- 1 2 2 2 3 4 4
Step1 1 0 2 != 1 → 写入 1 2 2 2 3 4 4(写入到原位置,无变化)→ write=1
Step2 2 1 2 == 2 → 跳过 1 2 2 2 3 4 4
Step3 3 1 2 == 2 → 跳过 1 2 2 2 3 4 4
Step4 4 1 3 != 2 → 写入 写入 index=2 → 1 2 3 2 3 4 4 → write=2
Step5 5 2 4 != 3 → 写入 写入 index=3 → 1 2 3 4 3 4 4 → write=3
Step6 6 3 4 == 4 → 跳过 1 2 3 4 3 4 4
相关推荐
YHHLAI6 分钟前
LeetCode 1.两数之和 | 从暴力枚举到线性优化
算法·leetcode·职场和发展
Urbano7 分钟前
工装标准缝纫流程及自动化升级提质增产方案
大数据·人工智能·算法
KaMeidebaby34 分钟前
卡梅德生物技术快报|biotin 生物素标记抗体全流程
前端·人工智能·算法·数据挖掘·数据分析
阳明山水40 分钟前
自下而上 vs 自上而下 vs 最优组合预测策略解析
大数据·人工智能·深度学习·算法·机器学习
keykey6.42 分钟前
从逻辑回归到 SVM:不仅仅是“分开“
算法·机器学习·支持向量机
QN1幻化引擎1 小时前
RingBuffer:用"循环缓冲区"干掉KV Cache的O(n)显存膨胀
算法·github
papership1 小时前
【入门级-算法-8、图论算法:泛洪算法 (Flood Fill)】
算法·图论
MartinYeung51 小时前
[论文学习]LLM 情境学习资料的快速精确遗忘技术:基于 In-Context Learning 与量化 K-Means 的 ERASE 方法
学习·算法·kmeans
林森lsjs1 小时前
【日耕一题】5. 青春常数(17届蓝桥杯C++B组第一题)
算法·蓝桥杯
Tisfy1 小时前
LeetCode 3838.带权单词映射:求和、取模、拼接(附python一行版)
python·算法·leetcode·字符串·题解·模拟·取模