题目地址(27. 移除元素)
https://leetcode-cn.com/problems/remove-element/
题目描述
1 | 给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度。 |
前置知识
- 双指针
- 两端指针
公司
- 字节跳动 谷歌
思路
思路比较简单,使用双指针,一个用来表紧检索到的位置(left),一个用来标记可以交换的位置(right),当left遍历到非法数字(val)的时候,与right所在的合法字符串进行位置交换,因为这里题目不考虑顺序问题,所以直接交换就可以。最后输出right+1
关键点
- 注意right指针指向的一定要是合法字符,如果指向的是非法字符,则进行交换的时候会将right所在的非法字符减缓到前面,而此时left指针已经迁移,导致非法字符最后被输出。
- 主要使用while循环的条件是right指针大于等于left指针(反之亦可),如果忽略相等的情况,在元素只有一个且是非法元素的时候会不进入判断,从而输出非法元素。
- 最后一定是返回的right+1,最开始返回的是left,但是考虑到while循环判断的时候考虑了相等的情况,这样在while循环结束的时候会出现right小于left的情况,因为保证了right指向的始终是合法的元素,所以如果right右边一定都是非法元素,而此时left已经指向了非法元素,如果使用left+1,则会多输出一个非法元素,导致错误。
代码
- 语言支持:Java
Java
Code:
1 |
|
复杂度分析
令 n 为数组长度。
- 时间复杂度:$O(n)$
- 空间复杂度:$O(n)$