快慢二分法查找c++
时间: 2025-01-15 11:17:10 浏览: 52
### C++ 中快慢指针与二分法的应用
#### 快慢指针检测链表中的环并找到入口
在解决特定问题时,可以利用快慢指针来判断是否存在循环结构,并定位到该循环的起始位置。对于这个问题的具体实现如下所示:
```cpp
int findDuplicate(vector<int>& nums) {
int slow = nums[0];
int fast = nums[nums[0]];
while (slow != fast){
slow = nums[slow];
fast = nums[nums[fast]];
}
int finder = 0;
while(finder != slow){
finder = nums[finder];
slow = nums[slow];
}
return finder;
}
```
上述代码展示了如何通过调整 `slow` 和 `fast` 的移动速度,在发现两者相遇之后再引入一个新的指针 `finder` 来共同前进直至再次交汇于入环处[^1]。
#### 使用快慢指针优化数组操作
当面对需要删除列表中指定数值的任务时,可以通过设置一对快慢指针分别负责遍历原始序列和构建不含目标项的新子集。这种方式不仅提高了效率而且简化了逻辑设计过程[^3]。
```cpp
int removeElement(vector<int>& nums, int val) {
int slowIndex = 0;
for(int fastIndex = 0; fastIndex < nums.size(); ++fastIndex){
if(nums[fastIndex] != val){
nums[slowIndex++] = nums[fastIndex];
}
}
return slowIndex;
}
```
这段程序片段说明了怎样借助双指针技巧有效地过滤掉不需要保留的数据元素,从而达到清理容器的目的。
#### 结合二分查找提高搜索性能
针对有序排列的数据集合执行检索任务时,则可考虑采用经典的二分策略进一步提升查询速率。下面给出了一种基于迭代方式完成此功能的方法实例[^2]:
```cpp
int binarySearch(const vector<int> &arr, int target) {
int left = 0, right = arr.size() - 1;
while (left <= right) {
int mid = left + ((right - left) >> 1);
if (arr[mid] == target)
return mid;
else if (arr[mid] < target)
left = mid + 1;
else
right = mid - 1;
}
return -1;
}
```
这里运用位运算符 (`>>`) 替代传统的除法计算中间索引值,体现了对底层硬件特性的充分利用以增强算法表现力。
阅读全文
相关推荐














