移除元素(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 双指针排序法
代码如下:
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21// 对于整型变量的快速排序 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 双指针乱序法
代码如下:
复制代码
1
2
3
4
5
6
7
8
9
10
11int 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实现
遍历数组法代码如下:
复制代码
1
2
3
4
5
6
7
8
9
10class 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.内容请搜索靠谱客的其他文章。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复