方法一:快慢指针
low,fast指针起始都在0的位置。
算法思想:遍历数组的元素,如果nums[fast]==val,那么fast++,如果nums[fast]!=val,那么将fast的值给low,并且二者都++,最终low的下标,即为删除后元素的个数。
时间复杂度O(n)
空间复杂度O(1)
int removeElement(int* nums, int numsSize, int val){ int fast = 0; int low = 0; //快指针遍历数组元素 for(fast=0;fast<numsSize;fast++) { //如果元素不同,赋给low if(nums[fast]!=val) { nums[low++]=nums[fast]; } } return low; }
方法2:双指针优化
当nums[]=[1, 1 ,1 , 1, 0,2],val = 1时,方法1的两个指针都需要遍历一次数组,这样很麻烦。原题目说[0,2],[2,0],都可以,因此我们可以优化一下。
算法思想:首先令left指向初始下标,rigth指向尾下标。如果left的值等于val,那么将right的值赋给left,接着left++,right–,如果left元素不等于val,直接left++。一直走到两个元素相遇位置。这样最坏的情况,也仅仅遍历一次数组。
int removeElement(int* nums, int numsSize, int val){ int left = 0; int right = numsSize - 1; while(left<=right) { if(nums[left]==val) { //如果right的值等于val,那么仅仅right--,left不动 if(nums[right]!=val) { nums[left] = nums[right]; left++; } right--; } else { left++; } } return left; }
关于快慢指针的练习:
以上就是关于移除元素的代码思路,如果大佬们有更多的想法,欢迎在评论区讨论。💞