双指针的基本认识

双指针算法

双指针算法的核心就是依据某些性质(单调性), 将本来需要两重循环 $ O(n^{2}) $ 来枚举的优化成 $ O(2 n) $ 的, 即两个指针总共循环的次数不超过 $2n$ 次

双指针算法用处广泛, 如在快排、归并排序中使用

 

思考方式

先写一个暴力算法, 然后找出两个指针之间的规律(如单调性), 最终使得求解时指针不向回退, 达到优化的目的

 

类型

类型一, 指针指向同一个序列(如快排)

类型二, 指针指向多个序列(如归并)

 

基本模式

for(i = 0, j = 0; i < n; i++) {
    //check函数检查每道题目中的具体逻辑
    while(j < i && check(i, j)) j++;
}

 

取出字符串中的每一个单词就是一种双指针算法

指针 $i$ 循环整个字符串, 当碰到不是空格的字符时, 开指针 $j$ 来找到这个单词结束的位置, 找到后取出整个字符串, 并使得 $i = j$

for(int i = 0; i < str.size(); i++) {
    int j = i + 1;
    while(j < str.size() && str[j] != ' ') j++; //只要j没有到终点且j对应的字符不是空格, j就++(取出往后不为空格的字符)
    cout << str.substr(i, j - i) << '\n';     //输出当前以i为首, j为尾的单词
    i = j;
}

 

posted @ 2020-10-07 10:49  yikanji  阅读(277)  评论(0)    收藏  举报