最长连续相同值片段长度为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></int>):
int longestConsecutiveSame(const std::vector<int>& arr) {
if (arr.empty()) return 0;
int max_len = 1, current_len = 1;
for (int i = 1; i <h3>当数组元素是自定义类型时要注意什么</h3>
<p>如果数组元素是结构体或类,<code>==</code> 操作符必须已正确定义,否则编译失败或行为未定义。不建议依赖默认逐字节比较——它不保证逻辑相等性。</p>
<ul>
<li>确认该类型有 <code>operator==</code>,且语义符合“值相等”预期</li>
<li>若用 <code>std::array</code> 或原始数组,注意传参时别退化为指针,丢失大小信息</li>
<li>对 <code>const char*</code> 这类指针类型,直接 <code>==</code> 比较的是地址,不是字符串内容——此时得用 <code>std::strcmp</code> 或转 <code>std::string</code>
</li>
</ul>
<h3>性能和可读性的实际取舍</h3>
<p>O(n) 时间、O(1) 空间是最优解,没必要用 <code>std::unordered_map</code> 统计频次,那会错判「连续」条件,还引入哈希开销。</p>
<p>容易被忽略的一点:如果需要同时返回起始位置和长度,别只存 <code>max_len</code>,还要同步更新 <code>best_start</code> 索引——每次 <code>current_len</code> 刷新 <code>max_len</code> 时,<code>best_start = i - current_len + 1</code>。</p></int>C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!











