双指针初始位置依问题类型而定:对向双指针(如两数之和)left=0、right=size()-1;快慢指针(如去重)slow与fast均从0或1起始;常见错误是right误设为size()致越界。

双指针遍历数组时,左右指针的初始位置怎么设
关键看你要解决的问题类型。如果是查找两数之和、去重、滑动窗口这类问题,left 通常从 0 开始,right 从 size() - 1 开始(对向双指针);如果是快慢指针(如删除重复元素),slow 和 fast 都从 0 或 1 启动,但步进逻辑不同。
容易踩的坑:right 初始化写成 size() 导致越界;或者在 while (left 循环里漏掉 <code>= 边界判断,错过中间元素。
- 对向双指针:适用于已排序数组、需要配对检查的场景,比如找和为
target的两个数 - 快慢指针:适用于原地修改、压缩数组,比如
std::vector<int>& nums</int>去重后返回新长度 - 滑动窗口类双指针:一个指针扩展右边界,另一个收缩左边界,常配合
sum或哈希统计使用
对向双指针的经典写法和常见错误
以查找两数之和为例,数组升序排列:
int left = 0, right = nums.size() - 1; while (left <p>这里不能用 <code>for</code> 循环替代,因为左右指针移动不独立——每次只动一个,且方向相反。常见错误包括:</p><div class="aritcle_card flexRow artxards"> <div class="artcardd flexRow"> <a class="aritcle_card_img" rel="nofollow" href="/xiazai/skill5502" title="C++ Code Review Master"><img src="https://img.php.cn/upload/skill/000/000/081/179051228971575.jpg" alt="C++ Code Review Master" onerror="this.onerror='';this.src='/static/lhimages/moren/morentu.png'" ></a> <div class="aritcle_card_info flexColumn"> <a rel="nofollow" href="/xiazai/skill5502" title="C++ Code Review Master" class="overflowclass">C++ Code Review Master</a> <p class="overflowclass">组合式C++代码评审方案,融合静态分析、AI推理、多轮迭代评审和C++专项检查,适用于PR审查、增量代码审查、全项目评审和代码质量评分,触发词包括review cpp、cpp代码评审、C++review、代码审查。</p> </div> <a rel="nofollow" href="/xiazai/skill5502" title="C++ Code Review Master" class="aritcle_card_btn flexRow flexcenter"><b></b><span>下载</span> </a> </div> </div>
- 把
left++和right--写反,导致逻辑错乱 - 没考虑数组为空或只有一个元素,直接访问
nums.back()报std::out_of_range - 用
left 而非 <code>left ,当 <code>left == right时重复计算同一元素(题目通常要求“两个不同下标”)
快慢指针处理原地去重时,slow 和 fast 怎么同步更新
以 std::vector<int>& nums</int> 删除重复项并返回新长度为例,核心是让 slow 指向下一个可写位置,fast 扫描所有元素:
if (nums.empty()) return 0; int slow = 1; for (int fast = 1; fast <p>注意:<code>slow</code> 初始为 <code>1</code>,因为第 <code>0</code> 个元素天然保留;<code>fast</code> 也从 <code>1</code> 开始比较,避免自己跟自己比。性能上这是 <code>O(n)</code> 时间、<code>O(1)</code> 空间,但前提是数组已排序——如果未排序,快慢指针无法直接去重,得换哈希表。</p>
- 若题目允许改变顺序,可用
std::sort预处理,再上快慢指针 -
slow - 1是当前最后一个不重复值的位置,不是slow本身 - 返回值是新长度,不是修改后的 vector,调用方需按此截断
双指针遍历时如何避免整型溢出和符号问题
当数组下标参与算术运算(比如 mid = (left + right) / 2),left 和 right 都是 size_t(无符号)时,left > right 可能导致极大正数,循环失控。C++ 中最稳妥的方式是统一用有符号整型做索引:
- 声明指针变量时显式用
int left = 0,而不是依赖auto left = 0(后者推导为int没问题,但不明确) - 调用
nums.size()后强制转为int:int n = static_cast<int>(nums.size())</int>,再设right = n - 1 - 比较大小前确认类型一致,比如不要混用
size_t和int做判断,否则编译器可能静默提升,引发意外行为
实际项目中,这个问题往往在数据量大或跨平台时才暴露,容易被忽略。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!










