概述
移除元素(C, Python)
- 1. 题目描述
- 2. 题目分析
- 3. C语言实现
- 3.1 双指针排序法
- 3.2 双指针乱序法
- 4. Python实现
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)
运行结果为:
最后
以上就是健壮芹菜为你收集整理的LeetCode--27. 移除元素(双指针)的全部内容,希望文章能够帮你解决LeetCode--27. 移除元素(双指针)所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复