数据结构与算法入门指南目录
需要维护数组区间,或者同时维护两个值,或者同时维护两个数组,一般能用到双指针算法。
双指针顾名思义就是操纵两个指针进行运算,两个指针在数组中能表示一段区间。
例如快速排序中就用到了双指针算法,左指针寻找比基准点大的数,右指针寻找比基准点小的数。
再例如二分中也用到了两个指针(l, r)维护一段可能存在值的区间。
虽然双指针与其说是算法,不如说是一个思想,由于做题的时候遇到的几率还是挺大的,所以开一篇专门讲双指针。
同向双指针
两数之和
思路很简单,从目前元素往后找,如果没找到就找下一个元素,由于之前的组合已经试过了,所以j从i + 1开始。复杂度O(n^2)
vector<int> twoSum(vector<int>& nums, int target)
{
vector<int> Res;
for (int i = 0; i < nums.size(); i++)
{
int j = i + 1;
while (j < nums.size() && nums[i] + nums[j] != target) j++;
if (j < nums.size()) return { i, j };
}
return Res;
}
相向双指针
判断是否为回文字符串
bool isPalindrome(string str)
{
int size = str.size();
for (int i = 0, j = size - 1; i < size / 2; i++, j --)
if (str[i] != str[j]) return false;
return true;
}
另一种写法
bool isPalindrome(string str)
{
int i = 0, j = str.size() - 1;
while (i < j)
{
if (str[i] != str[j]) return false;
i++, j--;
}
return true;
}
虽然示例的例题没有几道,毕竟双指针只能算是一种想法,具体如何使用还是得看具体的题目,多做类似的题就能掌握了。