27 移除元素

65 阅读1分钟

前言

数组的元素在内存地址中是连续的,不能单独删除数组中的某个元素,只能覆盖。

快慢指针

解题思路

  • 快指针:寻找新数组的元素,然后更新
  • 慢指针:要更新的位置
class Solution {
    /**
     * 快指针:寻找新数组的元素,然后更新
     * 慢指针:要更新的位置
     * @param nums
     * @param val
     * @return
     */
    public int removeElement(int[] nums, int val) {
       // 定义慢指针
       int slow = 0;
       for (int fast = 0; fast < nums.length; fast++) {
          // 是新数组的元素的元素,才更新
          if (nums[fast] != val) {
             nums[slow] = nums[fast];
             slow++;
          }
       }
       return slow;
    }
}

对碰指针

解题思路

左边找删除的值,右边找不需要删除的值,左边和右边的值进行交换,最终左边区域的值就是有效的部分(删除了指定元素后,还剩下的元素)

image.png

class Solution {
    /**
     * 对碰双指针
     * 目标:左边是有效的部分,右边是无效部分
     * left 找要删除的值
     * right 找不要删除的值
     * @param nums
     * @param val
     * @return
     */
    public int removeElement(int[] nums, int val) {
       // 定义慢指针
       int left = 0;
       int right = nums.length - 1;
       while (left <= right) {
          // 交换
          if (nums[left] == val && nums[right] != val) {
             int temp = nums[left];
             nums[left] = nums[right];
             nums[right] = temp;
          }
          // left 找要删除的值
          if (nums[left] != val) {
             left++;
          }
          //right 找不要删除的值
          if (nums[right] == val) {
             right--;
          }
       }
       return left;
    }
}