前后指针法,与其说是一个题型,不如说是一种思想:
在一个数组中筛选符合条件的元素,并放在原数组中。
class Solution {
public:
int removeElement(vector& nums, int val) {
int slowstr=0;//定义慢指针为数组下标
int faststr=0;//定义快指针指向所需的值
for(faststr=0;faststr
在移除元素中就体现为移除满足条件的元素。然后再放在原数组中。
多元素去重,本质上就是筛选出数组中多个相等的元素。题目要求使用原数组,因此可以考虑前后指针法,只需要将slow++放在nums[slow]=nums[fast]之后即可。
class Solution {
public:
void moveZeroes(vector& nums) {
int faststr=0;
int slowstr=0;
for(faststr=0;faststr
本题给我们的启示为,当在相同数组中进行筛选的时候可以优先考虑前后指针法,这里给了条件是升序数组。所以说还需要有一定的条件,根据该条件来调整代码即可。
首先依然满足条件,筛选出来的元素存放在原数组中,而具有某种属性最终会体现在slow指针如何处理上。fast指针继续正常遍历即可。
在这里每当发生退格的时候,slow–,并且当–为小于0的数时,将其置为0。
class Solution {
public:
string StrSolution(string str)
{
int faststr=0;
int slowstr=0;
for(faststr=0;faststr
其中如果不使用字符串切割,string类不会因为看到’\0’而结束。但是如果在构造的时候有’\0’那么可以结束。因此还需要进行字符串切割。
class Solution {
public:
vector> threeSum(vector& nums) {
vector> result;
sort(nums.begin(),nums.end());
for(int i=0;i0&&nums[i]==nums[i-1])
{
continue;
}
int left=i+1;
int right=nums.size()-1;
while(left0)
{
right--;
}
else
{
left++;
}
}
}
return result;
}
};
前后指针法不是一个固定的题型,重要点在于识别。
本文将持续进行更新。