数组移除元素

暴力枚举

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)

双指针法

双指针法,特别是快慢指针法。用于在一次遍历中解决需要两次遍历的问题。这种方法特别适用于数组或链表中的问题,如移除特定元素、合并排序数组等。

  1. 定义快慢指针
    • 快指针:用于遍历整个数组或链表,寻找不包含目标值val的元素。
    • 慢指针:用于指向新数组(或在原数组中更新位置)的下标,即指向下一个不包含目标值的元素应该放置的位置。
  2. 工作机制
    • 在一次for循环中,快指针遍历数组,检查每个元素是否等于目标值val
    • 如果快指针指向的元素不等于val,慢指针就将这个元素复制或移动到慢指针的位置,然后慢指针向前移动一位。
    • 如果快指针指向的元素等于val,快指针继续向前移动,但不更新慢指针的位置。
  3. 优点
    • 空间效率:只需要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)
posted @ 2024-12-25 20:25  stephen_zuo  阅读(37)  评论(0)    收藏  举报