算法训练:2.移除元素(快慢指针)

算法原题: 27. 移除元素 - 力扣(LeetCode)


移除数组元素

  • 移除一个元素时,需要将该元素之后的所有元素依次向前移动一个位置,以填补被移除元素的空位,对于静态数组来说,数组的长度是不会发生变化的,多余的数组元素不进行处理:例如{1,2,3,4}移除3,数组会得到{1,2,4,4}

解题思路

暴力移除

  • 通过for循环嵌套,访问到目标元素就将其后面的所有元素向前移动一格,循环往复

快慢指针(本节主要内容)

快慢指针是双指针的特殊用法,一个移动得较快,一个移动得较慢

  • 快指针对数组进行遍历,慢指针用来把移除之后的元素依次组合起来
int slow = 0;
for(int fast = 0; fast <nums.length; fast++) {

}
  • 快指针遍历数组元素的时候和目标元素进行比对,如果不是目标元素,则通过 nums[slow] = num[fast] 保留当前这个数组元素,并让慢指针指向下一格
if (nums[fast] != val) {
	nums[slow] = nums[fast];
	slow++;
}
  • 如果是目标元素,则说明此时的 num[fast]需要被丢弃,则不需要移动慢指针,继续下一次循环,这一步的逻辑可以直接不写(此次循环不进行处理会直接跳过,fast++

完整代码实现

class Solution {
    public int removeElement(int[] nums, int val) {
        int slow = 0;
        for (int fast = 0; fast < nums.length; fast++) {
            //if (nums[fast] == val) {
            //    continue;
            //} else if (nums[fast] != val) {
            //    nums[slow] = nums[fast];
            //    slow++;
            //} // 效果和下面等同
            if (nums[fast] != val) {
                nums[slow] = nums[fast];
                slow++;
            }
        }
        return slow;
    }
}

你可能感兴趣的:(小白算法训练,算法)