题目
给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度。
不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并原地修改输入数组。
元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。
输入:nums = [3,2,2,3], val = 3
输出:2, nums = [2,2]
解释:函数应该返回新的长度 2, 并且 nums 中的前两个元素均为 2。你不需要考虑数组中超出新长度后面的元素。例如,函数返回的新长度为 2 ,而 nums = [2,2,3,3] 或 nums = [2,2,0,0],也会被视作正确答案。
解题思路
误点:数组的元素在内存地址中是连续的,不能单独删除数组中的某个元素,只能覆盖。
-
傻瓜解法(Python可以直接删除数组元素)
使用现成的函数功能(这是我作为小白的第一想法,回过头看真是惭愧啊啊啊)class Solution(object): def removeElement(self, nums, val): """ :type nums: List[int] :type val: int :rtype: int """ # 使用python自带功能 for i in range(len(nums)): if val in nums: nums.remove(val) return len(nums)
-
暴力解法(两层循环)
class Solution(object): def removeElement(self, nums, val): """ :type nums: List[int] :type val: int :rtype: int """ s = len(nums) i = 0 while i < s: # 发现目标值,就将数组整体前移1位 if nums[i] == val: for j in range(i+1, s): nums[j-1] = nums[j] i -= 1 s -= 1 i += 1 return s
-
快慢指针
class Solution(object): def removeElement(self, nums, val): """ :type nums: List[int] :type val: int :rtype: int """ slow = 0 for i in range(len(nums)): # 当遇到非目标值时,慢指针才前进更新 if nums[i] != val: nums[slow] = nums[i] slow += 1 return slow