使用双指针移除数组指定元素

这是一个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 的时候,有等号才能删去。

posted @ 2020-10-03 19:47  哦客源  阅读(194)  评论(0)    收藏  举报