IVW150-2-移除元素
题目描述
给你一个数组 nums
和一个值 val
,你需要 原地 移除所有数值等于 val
的元素。元素的顺序可能发生改变。然后返回 nums
中与 val
不同的元素的数量。
假设 nums
中不等于 val
的元素数量为 k
,要通过此题,您需要执行以下操作:
- 更改
nums
数组,使nums
的前k
个元素包含不等于val
的元素。nums
的其余元素和nums
的大小并不重要。 - 返回
k
。
示例 1:
plaintext
1 | 输入:nums = [3,2,2,3], val = 3 |
算法思路
有时候觉得我菜的抠脚,就比如这道题,很明显的双指针,但是我糖了半天,最后虽然过了,但是效率也出奇的低,大致讲一下我的shit思路:
- 一个指针
i
用来指向目标元素val
,另一个指针j
指向非目标元素 - 交换
nums[i],nums[j]
,重复此步骤 - 遍历数组,记录
val
的个数k
,返回n-k
。
最有槽点的其实就是第三步,明明我们在交换的这个步骤中就可以记录val
的数量,为啥还要在遍历一次,其实主要是我没解决一个问题:如果测试样例是这样,nums=[1, 1, 1], val = 1
,那这样就不需要交换,进而就没办法同步计数val
的值,大晚上我也有点懒得解决问题了,就想了个这么低效的办法,最后的代码真是屎山:
cpp
1 | class Solution { |
再来看看两个月前我看代码随想录时写的题解,其实类似于快慢指针,真是天壤之别:
cpp
1
2
3
4
5
6
7
8
9
10
11
12 class Solution {
public:
int removeElement(vector<int>& nums, int val) {
int n = nums.size(), j = 0;
for (int i = 0; i< n; i++) {
if (nums[i] != val) {
nums[j++] = nums[i];
}
}
return j;
}
};
明显高效的多,乐……
All articles on this blog are licensed under CC BY-NC-SA 4.0 unless otherwise stated.