使用双指针移除数组指定元素
这是一个LeetCode题目,第27题,因为结果比较好,所以记录一下过程。这个提交速度是100%,内存是70%多
思路是:前后各一个指针。遇到待删除的元素就和结尾交换位置。
这个交换位置避免了复制数组这个费时的操作。
1 public int removeElement(int[] shuRu, int muBiao) { 2 // 遍历,使用前后指针进行交换,这样可以避免数组的复制。 3 int changDu = shuRu.length; 4 int r = changDu-1; // 指针, 下面的 l 为左指针。 5 for(int l=0; l<=r; l++){ 6 if(shuRu[l] == muBiao){ 7 // 交换 8 if(shuRu[r] != muBiao){ 9 int temp = shuRu[l]; 10 shuRu[l] = shuRu[r]; 11 r--; 12 continue; 13 }else{ 14 // r指针和目标也相等,先r-- 15 r--; 16 l--; 17 if(l<-1)l=-1; 18 continue; 19 } 20 } 21 } 22 return r+1; 23 }
这里需要注意的是第5行,第5行一定要 l<=r。因为这样在处理末尾删除的时候,可以让r再减一次。比如数组[1,2,3,4],删除 4 的时候,有等号才能删去。

浙公网安备 33010602011771号