双指针算法

双指针核心思想

按照目前的理解,抽象出的一句话是

两个数据的变化具有一定的关联关系时可以考虑双指针

例如,在一有序数组中,找到和为0的两个数的所有数对
设一组解为 a + b == 0,那么当a增大为a'时,设对应的可行解为a' + b' == 0,显然,b' < b
即随着a的增大,b的可行解一定在之前解的左侧。该性质的存在使得不再需要让b逐一枚举所有值
a从小到大,b从大到小,使用两个指针维护它们的位置,两者均从两侧向中间运动,复杂度即从O(N2)降低为O(N)

例子1-unique去重函数

// <algorithm>中现成的函数unique应用示例
#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

int main()
{
    vector<int> a;
    int i = 0;
    while (i ++ < 5)
    {
        a.push_back(i);
        a.push_back(i);
    }
    for (int i = 0; i < a.size(); ++ i) cout << a[i] << ' '; cout << endl;
    unique(a.begin(), a.end());
    for (int i = 0; i < a.size(); ++ i) cout << a[i] << ' ';
    return 0;
}

输出结果:

可以看出它的实现逻辑就是把不重复的数据放到前面,后面的元素不动

// 使用双指针算法实现unique
// 偏向真正的实现方式
vector<int>::iterator unique(vector<int>::iterator begin, vector<int>::iterator end)
{
    vector<int>::iterator j = begin;
    for (vector<int>::iterator i = begin; i != end; ++ i)
        if (i == begin || *i != *(i - 1))
            *(j ++ ) = *i;
    return j;
}
// 简易版本,更好体现双指针算法
vector<int>::iterator unique(vector<int> &vec)
{
    int j = 0;
    for (int i = 0; i < vec.size(); ++ i)
        if (!i || vec[i] != vec[i - 1])
            vec[j ++] = vec[i];
    return vec.begin() + j;
}

相关练习题

posted @   0x7F  阅读(59)  评论(0编辑  收藏  举报
编辑推荐:
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
阅读排行:
· 终于写完轮子一部分:tcp代理 了,记录一下
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
点击右上角即可分享
微信分享提示