移除元素专题¶
约 531 个字 290 行代码 预计阅读时间 5 分钟
本节介绍¶
前面提到,数组中需要移除元素不可以直接删除,因为数组是一个连续的结构,删除元素只能通过将被删除的元素进行覆盖,此时就必定涉及到将被删除元素的后面元素向前依次挪动,本节主要关注数组中移动元素的问题以及感受双指针算法,在后面会详细介绍本算法
示例题目¶
Quote
给你一个数组 nums 和一个值val
,你需要 原地 移除所有数值等于val
的元素。元素的顺序可能发生改变。然后返回nums
中与val
不同的元素的数量。
假设nums
中不等于val
的元素数量为k
,要通过此题,您需要执行以下操作:
更改nums
数组,使nums
的前k
个元素包含不等于val
的元素。nums
的其余元素和nums
的大小并不重要。
返回 k。
示例 1:
C++ | |
---|---|
1 2 3 4 |
|
示例 2:
C++ | |
---|---|
1 2 3 4 5 |
|
思路分析:
-
解法1:暴力解法
暴力解法的思路就是移动数组元素的基本逻辑:移除某一个元素就是将该元素后面的每一个元素向前挪动。暴力解法的时间复杂度是\(O(N^2)\)
-
解法2:双指针算法
本题可以使用快慢指针的方法,本质就是双指针算法,其中
slow
指针指向待被覆盖的元素,fast
找不等于被删除的元素
C++ | |
---|---|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
|
C++ | |
---|---|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
|
相关题目¶
力扣26.删除有序数组中的重复项¶
参考代码:
C++ | |
---|---|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
|
力扣283.移动零¶
参考代码:
C++ | |
---|---|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
|
力扣844.比较含退格的字符¶
参考代码:
C++ | |
---|---|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
|
C++ | |
---|---|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 |
|
力扣977.有序数组的平方¶
参考代码:
C++ | |
---|---|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
|
C++ | |
---|---|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
|
C++ | |
---|---|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
|