要知道数组的元素在内存地址中是连续的,不能单独删除数组中的某个元素,只能覆盖。
暴力解法
这个题目暴力的解法就是两层for循环,一个for循环遍历数组元素 ,第二个for循环更新数组。
很明显暴力解法的时间复杂度是O(n^2),这道题目暴力解法在leetcode上是可以过的。
双指针法
双指针法(快慢指针法): 通过一个快指针和慢指针在一个for循环下完成两个for循环的工作。
定义快慢指针
- 快指针:寻找新数组的元素 ,新数组就是不含有目标元素的数组
- 慢指针:指向更新 新数组下标的位置
双指针法(快慢指针法)在数组和链表的操作中是非常常见的,很多考察数组、链表、字符串等操作的面试题,都使用双指针法。
注意这些实现方法并没有改变元素的相对位置!
- 时间复杂度:O(n)
- 空间复杂度:O(1)
相向双指针方法,基于元素顺序可以改变的题目描述改变了元素相对位置,确保了移动最少元素。
流程为:
初始化左右指针分别在数组的两端。
在左右指针没有相遇的情况下执行以下的循环:
在左指针比右指针小且没有找到要移除的val时移动左指针。
在右指针比左指针大且没有找到不等于val时移动右指针。
判断左指针是否比右指针小(防止错误的交换),如是,交换左右指针所指的值。