27.移除元素

思路简述

这个题有两种方法,第一种是暴力,另一种是双指针法。而且需要注意的是不能使用额外的数组空间。
但这两种方法的本质相同,都是将不等于val的数移到数组左部,或者说,将等于val和不等于val的两部分进行分离。
暴力法的核心算法是每当遇到一个等于val的数nums[i]时,就将下标i之后的所有数都向前移一位,移完后将数组nums的size减1。最后返回size;

public static int removeelement(int[] nums,int val) {
          int size=nums.length;
          for(int i=0;i<size;i++) {
              if(nums[i]==val) {
                for(int j=i+1;j<size;j++) {
                    nums[j-1]=nums[j];
                }
                size--;
                i--;
              }
          }
          return size;
     }

双指针法的核心算法在于设立left、right快慢指针,right指针任务是进行遍历,而left指针任务是保存值不是val的数,当right指针遇到不是val的数时,left指针将该数进行存储后右移。
left从左边界0开始,如果nums[right]不等于val,那么nums[left]=nums[right],同时left指针+1。最后返回的left指针,指向左部存储非val值的最后一位。

public int removeElement(int[] nums, int val) {
        int left=0;
        for(int right=0;right<nums.length;right++) {
            if(nums[right]!=val) {
                nums[left]=nums[right];
                left++;
            }   
        }
        return left;
    }

26.删除排序数组中的重复项

思路简述

首先要注意题目给出的是一个有序数组!换言之,重复的元素都是挨着的。
关键思路就是设置left和right指针(快慢指针),right指针负责遍历,left指针则负责判断right指针指向的元素是否和自己指向的元素相同,如果相同,则不动如山。如果不同,则left右移一位,并存储right指向的元素。即nums[left++]=nums[right];
注意,最后要返回left+1;因为是要返回数组的新长度。

public static int removeduplicates(int[] nums) {
         int left=0;
         for(int right=0;right<nums.length;right++) {
             if(nums[right]!=nums[left]) {
                 nums[++left]=nums[right];
             }
         }
         return left+1;
     }

双指针套路合集
https://zhuanlan.zhihu.com/p/95747836
可看上面这个总结


leetcode      双指针 数组

本博客所有文章除特别声明外,均采用 CC BY-SA 3.0协议 。转载请注明出处!