双指针数组
双指针数组介绍
例如:双指针数组中的指针并非我们常见的c语言指针,它更多指的是对数组下标操作的两种标量。
他大体可以分为两类,一类是快慢指针,一个是头尾指针。
我们可以借助下面的两张图帮助我们理解
(我们根据题型来选这二者)
示例题型(对应Leecode题号)
27.移除元素
代码如下(示例):
我们先从简单的开始入手,其实这个题就可以利用快慢数组。
class Solution {
public:
int removeElement(vector<int>& nums, int val) {
int j=0; //慢数组
if(nums.size()==0)
{
return 0;
}
else
{
for(int i =0;i<nums.size();i++)
{
if(nums[i] != val)
{
nums[j] = nums[i];//当条件成立时 慢数组下标往后移动
j++;
}
}
}
return j;
}
};
26.删除有序数组中的重复项
代码如下(示例):
这个题更为典型 是一个经典的快慢数组题 ++j = i++ 是解决这类问题的核心
class Solution {
public:
int removeDuplicates(vector<int>& nums) {
int j = 0;//慢数组
for(int i=1;i<nums.size();i++)
{
if(nums[j]!=nums[i])
{
nums[++j] = nums[i];//通过判断条件来使慢数组下标往后移
}
}
return j+1;
}
};
977.有序数组的平方
代码如下(示例):
这是一个经典的双指针应用题
无从下手时,多回忆回忆作者在上面画的 left-right图
class Solution {
public:
vector<int> sortedSquares(vector<int>& nums) {
int left = 0;
int right = nums.size()-1;
vector<int> result(nums.size(), 0);//创建新数组保存平方后的数据
int k = nums.size() -1;//用来指向新数组下标
while(left<=right)
{
if(nums[left]*nums[left]<nums[right]*nums[right])
{
result[k--] = nums[right]*nums[right];//因为新数组时从小到大 我们从后面开始填充元素
right --;//结合图 结合图 结合图 重要的事情说三遍
}
else
{
result[k--] = nums[left]*nums[left];//左右开始 比较左右元素的大小 谁大谁放进去 并且将位置移动到下一侧
left++;
}
}
return result;
}
};
总结
这类题刚入手时可能有点难度,但只要理解了双指针思想,便可以很快解决这一类题型。
作者题型:大家初刷Leecode倒也不用过分在意时间 空间复杂度,刷多了自然就会优化了。
一起加油~~~~