leetcode-27-easy

remove element
思路一: 先排序,然后去除数字

public static int removeElement(int[] nums, int val) {
    Arrays.sort(nums);
    int INVALID = -1;

    int L = INVALID;
    for (int i = 0; i < nums.length; i++) {
        if (nums[i] == val) {
            L = i;
            break;
        }
    }

    int R = INVALID;
    for (int i = L + 1; i < nums.length; i++) {
        if (nums[i] != val) {
            R = i;
            break;
        }
    }

    int count = 0;
    if (L != INVALID) count += L;
    if (R != INVALID) count += nums.length - R;

    int left = L == INVALID ? 0 : L;
    int length = R == INVALID ? 0 : nums.length - R;
    while (length > 0 && R < nums.length) {
        nums[left++] = nums[R++];
    }

    return count;
}

思路二: 双指针,left 指向需要移除的数字,right 碰到需要有效数字时和 left 交换。
right 向右移动时有两种情况

  • 有效数字, 和 left 交换,left 自增
  • 无效数字, 继续往右
    为什么最后 left 的值可以当成有效数组长度用? 因为有效数组长度一定小于或者等于原数组长度,而 left 和 right 遇到有效数字时都会自增,完成有效数字记录(间接完成数组长度记录), left 永远指向下一个无效数字或者处于自增状态
public static 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];
        }
    }

    return left;
}
posted @ 2022-10-10 18:01  iyiluo  阅读(21)  评论(0)    收藏  举报