要求:原地删除,不是用额外的空间;
1. 原地删除指定元素
**输入:**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元素都放在数组最后;
因此考虑2个指针,
i寻找val
,j从后向前寻找非val
;并在遍历的过程中,将val
放到后面;
class Solution: def removeElement(self, nums: List[int], val: int) -> int: i,j = 0, len(nums) - 1 while i < j: if nums[i] == val: temp = nums[i] nums[i] = nums[j] nums[j] = temp j -= 1 else: i += 1 return i if len(nums) == 0 or nums[i] == val else i + 1
2. 有序数组中的重复项只出现1次
前提:有序数组,重复项只保留1个,原地
- 因为有序,重复项都是连续的;
- 修改后的数组也要保持有序;
双指针:
- i:停留在不重复元素的末端;最终遍历完成,i指向的是完整的不重复数组的最后一个元素;
- j:寻找与i不同的下一个元素;
class Solution: def removeDuplicates(self, nums: List[int]) -> int: i, j = 0, 0 while j < len(nums): if nums[i] != nums[j]: i += 1 nums[i] = nums[j] j += 1 return i + 1
3. 有序数组中的重复项只出现2次
class Solution: def removeDuplicates(self, nums: List[int]) -> int: length = len(nums) if length <= 2: return length i, j = 2, 2 while j < length: if nums[j] != nums[i - 2]: nums[i] = nums[j] i += 1 j += 1 return i
有序数组中的重复项只出现n次:
class Solution: def removeDuplicates(self, nums: List[int], time: int) -> int: length = len(nums) if length <= time: return length i, j = time, time while j < length: if nums[j] != nums[i - time]: nums[i] = nums[j] i += 1 j += 1 return i