例如:双指针数组中的指针并非我们常见的c语言指针,它更多指的是对数组下标操作的两种标量。
他大体可以分为两类,一类是快慢指针,一个是头尾指针。
我们可以借助下面的两张图帮助我们理解
(我们根据题型来选这二者)
代码如下(示例):
我们先从简单的开始入手,其实这个题就可以利用快慢数组。
class Solution {public:
int removeElement(vector& nums, int val) { int j=0; //慢数组
if(nums.size()==0)
{ return 0;
}
else
{ for(int i =0;i if(nums[i] != val)
{ nums[j] = nums[i];//当条件成立时 慢数组下标往后移动
j++;
}
}
}
return j;
}
};
26.删除有序数组中的重复项代码如下(示例):
这个题更为典型 是一个经典的快慢数组题 ++j = i++ 是解决这类问题的核心
class Solution {public:
int removeDuplicates(vector& nums) { int j = 0;//慢数组
for(int i=1;i if(nums[j]!=nums[i])
{ nums[++j] = nums[i];//通过判断条件来使慢数组下标往后移
}
}
return j+1;
}
};
977.有序数组的平方代码如下(示例):
这是一个经典的双指针应用题
无从下手时,多回忆回忆作者在上面画的 left-right图
class Solution {public:
vectorsortedSquares(vector& nums) { int left = 0;
int right = nums.size()-1;
vectorresult(nums.size(), 0);//创建新数组保存平方后的数据
int k = nums.size() -1;//用来指向新数组下标
while(left<=right)
{ if(nums[left]*nums[left] result[k--] = nums[right]*nums[right];//因为新数组时从小到大 我们从后面开始填充元素
right --;//结合图 结合图 结合图 重要的事情说三遍
}
else
{ result[k--] = nums[left]*nums[left];//左右开始 比较左右元素的大小 谁大谁放进去 并且将位置移动到下一侧
left++;
}
}
return result;
}
};
这类题刚入手时可能有点难度,但只要理解了双指针思想,便可以很快解决这一类题型。
作者题型:大家初刷Leecode倒也不用过分在意时间 空间复杂度,刷多了自然就会优化了。
一起加油~~~~
你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧