移除元素(27. 简单难度)
题目来源
LeetCode 27. 移除元素[1]
题目描述
给你一个数组nums和一个值val,你需要原地移除所有数值等于val的元素。元素的顺序可能发生改变。然后返回nums中与val不同的元素的数量。
假设nums中不等于val的元素数量为k,要通过此题,您需要执行以下操作:
•更改nums数组,使nums的前k个元素包含不等于val的元素。nums的其余元素和nums的大小并不重要。•返回k。
示例
示例 1:
输入:nums = [3,2,2,3], val = 3输出:2, nums = [2,2,_,_]解释:你的函数函数应该返回 k = 2, 并且 nums 中的前两个元素均为 2。你在返回的 k 个元素之外留下了什么并不重要(因此它们并不计入评测)。
示例 2:
输入:nums = [0,1,2,2,3,0,4,2], val = 2输出:5, nums = [0,1,4,0,3,_,_,_]解释:你的函数应该返回 k = 5,并且 nums 中的前五个元素为 0,0,1,3,4。注意这五个元素可以任意顺序返回。你在返回的 k 个元素之外留下了什么并不重要(因此它们并不计入评测)。
作者思考
快慢指针思路:用两个指针,从后往前遍历。一个指针走在前面用来找到值等于val的元素,另一个指向要跟本次val交换的元素。当前面的指针找到时,交换两指针对应值,直到前面的指针遍历完。
对撞指针思路:同样是两个指针,一个从前往后,一个从后往前。左边的指针来找值等于val的元素,右边的指针用来赋值给左边的指针。当左边的指针找到时,右边的指针把值赋值给左边的指针,然后右边的指针左移一位(如果此时赋的值也是val,就再赋一次值,再左移)
抽象思维:把要删除的值为val的元素理解为一个"空位",想办法把有内容的元素往前占用这些空位。
🧠 题解
//java//快慢指针class Solution { public int removeElement(int[] nums, int val) { int tail = nums.length - 1; int index = tail; while(index >= 0){ if(nums[index] == val){ int temp = 0; temp = nums[index]; nums[index] = nums[tail]; nums[tail] = temp; tail--; index--; }else index--; } return tail + 1; }}//对撞指针//作者:力扣官方题解//链接:https://leetcode.cn/problems/remove-element/solutions/730203/yi-chu-yuan-su-by-leetcode-solution-svxi/class Solution { public int removeElement(int[] nums, int val) { int left = 0; int right = nums.length; while (left < right) { if (nums[left] == val) { nums[left] = nums[right - 1]; right--; } else { left++; } } return left; }}
References
[1]LeetCode 27. 移除元素: https://leetcode.cn/problems/remove-element/description/