算法题(16):原地移除元素
审题:
题目需要我们直接改变原数组的数据,达到所有的val值都被筛选出来,让剩下的非val数据随意排在数组前面,并且返回数组中非val数据的个数
思路:
方法一:双指针
我们让left负责指向正待赋值的索引处,right负责去遍历整个数组,找到非val值就赋值给left指向的位置
方法二:优化双指针
由于方法一可能存在因为开头处有val值就让数据都往前移动的情况,而这种情况如果我们直接把后面的数据给赋值到前面就可以避免这种情况。所以我们让right从后面开始遍历,直到left>=right为止
方法三:非原地解法
虽然题目让我们只能原地改变数组,但是其实他无法监视我们到底怎么实现,只可以看我们的结果,所以其实我们开个新数组,把数据处理好之后再把数据赋值给nums数组即可
解题:
方法一:双指针
方法二:优化双指针
注意:
为何当left位置的val被覆盖之后left不++?
因为不知道right-1索引位置的数据是不是val,所以我们只有确定left位置数据不是val才会++
方法三:非原地解法
k:用来记录非val的数据的个数有多少个
newnums数组只会记录非val的数据
27. 移除元素 - 力扣(LeetCode)