最长连续相同值片段长度为3(末尾三个1),需单次遍历维护当前与最大长度,注意自定义类型需正确定义==,避免指针误比较及无符号索引回绕。

用单次遍历找最长连续相同值片段
不需要额外空间或复杂数据结构,一次从左到右扫描就能搞定。核心是维护当前连续长度和历史最大长度,遇到值变化就重置计数器。
常见错误是把「连续」误当成「出现次数最多」——比如 {1,2,2,1,1,1} 的答案是 3(末尾三个 1),不是统计所有 1 的个数 4。
- 初始化
current_len = 1,max_len = 1,从索引1开始遍历 - 若
arr[i] == arr[i-1],则current_len++;否则重置为1 - 每次更新后比较并刷新
max_len - 空数组需单独处理(返回
0),单元素数组直接返回1
处理边界与类型安全的写法
裸指针或 std::vector 都适用,但要注意迭代器有效性与类型匹配。用 size_t 做索引可能在空容器时导致回绕(i-1 变成极大正数),所以推荐带符号整型或用迭代器方式。
示例(适用于 std::vector<int>):
立即学习“C++免费学习笔记(深入)”;
int longestConsecutiveSame(const std::vector<int>& arr) {
if (arr.empty()) return 0;
int max_len = 1, current_len = 1;
for (int i = 1; i < arr.size(); ++i) {
if (arr[i] == arr[i-1]) {
current_len++;
max_len = std::max(max_len, current_len);
} else {
current_len = 1;
}
}
return max_len;
}当数组元素是自定义类型时要注意什么
如果数组元素是结构体或类,== 操作符必须已正确定义,否则编译失败或行为未定义。不建议依赖默认逐字节比较——它不保证逻辑相等性。
- 确认该类型有
operator==,且语义符合“值相等”预期 - 若用
std::array或原始数组,注意传参时别退化为指针,丢失大小信息 - 对
const char*这类指针类型,直接==比较的是地址,不是字符串内容——此时得用std::strcmp或转std::string
性能和可读性的实际取舍
O(n) 时间、O(1) 空间是最优解,没必要用 std::unordered_map 统计频次,那会错判「连续」条件,还引入哈希开销。
容易被忽略的一点:如果需要同时返回起始位置和长度,别只存 max_len,还要同步更新 best_start 索引——每次 current_len 刷新 max_len 时,best_start = i - current_len + 1。


















