[https://leetcode.cn/problems/remove-element/](移除元素)
要求是原地移动,并且不能使用额外的数组空间(如果不是原地移动并且可以用额外空间的话,可以排序后遍历去除重复元素)可以考虑使用双指针法。 当快指针指向的值等于val时,快指针向前移动寻找下一个不等于val的值;当快指针指向的值不等于val时,将快指针指向的值赋给慢指针,慢指针递增表示左边处理完成;快指针和慢指针之间的值是val,快指针右边的值代表未处理的值。
相关题目:
[https://leetcode.cn/problems/remove-duplicates-from-sorted-array/](删除排序数组中的重复项)
要求是原地移动并且不能使用额外数组空间,数组是非递减排序,所以考虑双指针法。快指针寻找下一个不重复元素,当找到不重复的第一个元素时,将slow的下一个值改为这个元素。因为返回元素个数,所以返回slow+1。
[https://leetcode.cn/problems/move-zeroes/](移动零)
双指针法典型题型:fast指针找不等于0的元素,当fast指针指向的值不等于零时,将此值赋给slow指针指向的值,slow递增。slow右边是已处理的元素,中间是0,右边是已处理的元素。
快速排序
双指针法的典型应用
选基准值,通过双指针移动使得基准值的左边全都小于等于基准值,基准值的右边全都大于等于基准值;一般取第一个元素为基准值。
先让right指针从右到左移动,遇到比基准值小的值就将他赋给left指针(一开始指向基准值),left指针递增1;然后left指针从左到右移动,遇到比基准值小的值就将它赋给right指针,right指针递减后循环重新开始。直到left = right时循环结束,然后将base基准值赋给left指针。最后递归地进行左区间和右区间的排序。
`//快速排序:双指针法
void quicksort(vector
if (start > end || start < 0) return;
int left = start, right = end;
int base = nums[start];
while (left < right) {
while (left < right && nums[right] >= base) {
right--;
}
nums[left] = nums[right];
while (left < right && nums[left] <= base) {
left++;
}
nums[right] = nums[left];
}
nums[left] = base;
quicksort(nums,start,left-1);
quicksort(nums,left+1,end);
}`
标签:right,nums,基准值,元素,移除,指针,left
From: https://www.cnblogs.com/Blogwwww/p/18471013