双指针算法用于解决我们常见的删除数组中指定元素的问题比较方便,如一串数中,要求删除所有的2,并返回删除后的数组长度,
//这种问题的常规C语言解法,思想和原理较简单
int removeElement(int* nums, int numsSize, int val) {
for (int i = 0; i <= numsSize-1; )
{
if (nums[i] == val)
{
for (int j = i + 1; j <= numsSize - 1; j++)
{
nums[j - 1] = nums[j];
}
numsSize--;
}
else
{
i++;
}
}
return numsSize;
}
接下来使用双指针
//C语言实现
int removeElement(int* nums, int numsSize, int val) {
int L = 0;
int R;
for ( R=0; R < numsSize; R++)
{
if (nums[R] != val)
{
nums[L] = nums[R];
L++;
}
}
return L;
}
//C++实现
class Solution {
public:
int removeElement(vector<int>& nums, int val) {
int n = nums.size();
int left = 0;
for (int right = 0; right < n; right++) {
if (nums[right] != val) {
nums[left] = nums[right];
left++;
}
}
return left;
}
};
优化的双指针:
class Solution {
public:
int removeElement(vector<int>& nums, int val) {
int left = 0, right = nums.size()-1;
//right右侧的元素全是赋值到左边去了的,所以left与right+1相遇的时候,left及left右侧的元素全部对应right右侧,即无效元素,而left左侧全是有效元素,由于数组下标特殊性,left左侧有几个元素,left就是几,故left值就是删除指定元素后的数组长度
while (left < right+1) {
if (nums[left] == val) {
nums[left] = nums[right ];
right--;
} else {
left++;
}
}
return left;
}
};