数据结构与算法入门指南 - 双指针

405 阅读2分钟

数据结构与算法入门指南目录

需要维护数组区间,或者同时维护两个值,或者同时维护两个数组,一般能用到双指针算法。

双指针顾名思义就是操纵两个指针进行运算,两个指针在数组中能表示一段区间。

例如快速排序中就用到了双指针算法,左指针寻找比基准点大的数,右指针寻找比基准点小的数。

再例如二分中也用到了两个指针(l, r)维护一段可能存在值的区间。

虽然双指针与其说是算法,不如说是一个思想,由于做题的时候遇到的几率还是挺大的,所以开一篇专门讲双指针。

同向双指针

两数之和

思路很简单,从目前元素往后找,如果没找到就找下一个元素,由于之前的组合已经试过了,所以ji + 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;
}

虽然示例的例题没有几道,毕竟双指针只能算是一种想法,具体如何使用还是得看具体的题目,多做类似的题就能掌握了。

题目

力扣-数组和字符串-双指针

力扣-链表中的双指针