数组移除元素
- 27. 移除元素 - 力扣(LeetCode)
- 26. 删除有序数组中的重复项 - 力扣(LeetCode)
- 283.移动零(opens new window)
- 844.比较含退格的字符串(opens new window)
- 977.有序数组的平方(opens new window)
暴力枚举
int removeElement(vector<int>& nums, int val) {
int len = nums.size();
for (int i = 0; i < len; i++) {
if (nums[i] == val) {
for (int j = i + 1; j < len; j++) {
nums[j - 1] = nums[j];
}
i--;
len--;
}
}
return len ;
}
- 时间复杂度:O (n^2)
为它在每次找到目标值val时,都要通过一个内层循环将后面的所有元素向前移动一位,这个操作的时间复杂度是 O (n)。如果数组中有多个val,这个内层循环会被多次执行,导致整体时间复杂度接近 O (n^2)
双指针法
双指针法,特别是快慢指针法。用于在一次遍历中解决需要两次遍历的问题。这种方法特别适用于数组或链表中的问题,如移除特定元素、合并排序数组等。
- 定义快慢指针:
- 快指针:用于遍历整个数组或链表,寻找不包含目标值
val的元素。 - 慢指针:用于指向新数组(或在原数组中更新位置)的下标,即指向下一个不包含目标值的元素应该放置的位置。
- 快指针:用于遍历整个数组或链表,寻找不包含目标值
- 工作机制:
- 在一次
for循环中,快指针遍历数组,检查每个元素是否等于目标值val。 - 如果快指针指向的元素不等于
val,慢指针就将这个元素复制或移动到慢指针的位置,然后慢指针向前移动一位。 - 如果快指针指向的元素等于
val,快指针继续向前移动,但不更新慢指针的位置。
- 在一次
- 优点:
- 空间效率:只需要O(1)的额外空间,因为所有操作都在原数组上进行。
- 时间效率:只需要一次遍历,即O(n)的时间复杂度,其中n是数组的长度。
![[27.移除元素-双指针法.gif]]
class Solution {
public:
int removeElement(vector<int>& nums, int val) {
int slow = 0;
for (int fast = 0; fast < nums.size(); fast++)
{
if(nums[fast] != val){
nums[slow++] = nums[fast];
}
}
return slow;
}
};
- 时间复杂度:O(n)

浙公网安备 33010602011771号