LeetCode--27. 移除元素(双指针)

1. 题目描述

难度:简单
在这里插入图片描述

2. 题目分析

该题和26题很类似,解法也一样,需要注意的是一下几点:

  • 给定的输入数组是已经未排序
  • 需要在原地删除重复的元素,也就是说我们不可以在重新定义数组来存放结果,需要对原数组进行修改
  • 返回的是修改之后数组的长度,而不是数组本身
  • 不需要考虑数组中超出新长度后面的元素,也就是说,我们可以将原数组的前一部分更新为我们想要的结果,然后返回这部分的长度即可,不需要考虑着部分之后的元素是否也符合要求。举个例子:
    a = [0,0,1,1,2,2,2,3] 修改之后的a=[0,1,2,3,2,2,3] 我们只需要返回长度为4的a即[0,1,2,3]这一部分就可以了。

有三种方法:

  • 遍历元素法
    所谓的遍历元素法就是依次遍历数组,如果该元素与目标值相同,那么就将这个元素删除,该方法比较适合用python来实现。
  • 双指针排序法
    先对数组进行快速排序,双指针法数组完成排序后,我们可以放置两个指针 i和 j,其中 i 是慢指针,而 j 是快指针。只要 nums[i] = nums[j],我们就增加 j 以跳过重复项。
    当我们遇到 nums[j] != nums[i]时,跳过重复项的运行已经结束,因此我们必须把它(nums[j])的值复制到 nums[i + 1]。然后递增 i,接着我们将再次重复相同的过程,直到 j 到达数组的末尾为止。
  • 双指针乱序法
    不用对数组进行排序,直接用双指针法移除元素

3. C语言实现

3.1 双指针排序法

代码如下:

// 对于整型变量的快速排序
int inc (const void * a,const void *b)
{
    return *(int *)a - *(int *)b;
}

int removeElement(int* nums, int numsSize, int val){
    int i=0, j=0;
    // 对数组nums进行快速排序
    qsort(nums, numsSize, sizeof(nums[0]), inc);
    // 进行筛选
    for(j = 0; j < numsSize; j++){
        if(nums[j] != val){
            nums[i] = nums[j];
            i++;
        }
    }
    // 返回数组长度
    return i;
}

执行结果为:
在这里插入图片描述

3.2 双指针乱序法

代码如下:

int removeElement(int* nums, int numsSize, int val){
    int i=0, j=0;
    for(j = 0; j < numsSize; j++){
        if(nums[j] != val){
            nums[i] = nums[j];
            i++;
        }
    }
    return i;
}

输出结果为:
在这里插入图片描述

4. Python实现

遍历数组法代码如下:

class Solution:
    def removeElement(self, nums: List[int], val: int) -> int:
        i = 0
        while(i != len(nums)):
            if nums[i]==val:
                del nums[i] 
            else:
                i += 1  
        return len(nums)

运行结果为:
在这里插入图片描述

发布了163 篇原创文章 · 获赞 188 · 访问量 12万+

猜你喜欢

转载自blog.csdn.net/qq_42580947/article/details/104610095