# LeetCode27:移除元素 # 给你一个数组nums和一个值val,你需要原地移除所有数值等于val的元素,并返回移除后数组的新长度。 # 不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并原地修改输入数组。元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。 # 示例 1: 给定 nums = [3,2,2,3], val = 3, 函数应该返回新的长度2, 并且 nums 中的前两个元素均为 2。 你不需要考虑数组中超出新长度后面的元素。 # 示例 2: 给定 nums = [0,1,2,2,3,0,4,2], val = 2, 函数应该返回新的长度5, 并且 nums 中的前五个元素为 0, 1, 3, 0, 4。 你不需要考虑数组中超出新长度后面的元素 class Solution: # 暴力法: def removeElement(self, nums, val): i = 0 n = len(nums) while i < n: if nums[i] == val: for j in range(i+1, n): nums[j-1] = nums[j] i = i-1 n = n-1 i = i+1 return n # 双指针法: # 相向指针法: def removeElement2(self, nums, val): left = 0 right = len(nums)-1 while left <= right: if nums[left] == val: if nums[right] != val: nums[left] = nums[right] left += 1 right -= 1 else: left += 1 return left # 快慢指针法:不改变相对顺序 def removeElement3(self, nums, val): fastIndex = slowIndex = 0 n = len(nums) while fastIndex < n: if nums[fastIndex] != val: nums[slowIndex] = nums[fastIndex] slowIndex += 1 fastIndex += 1 return slowIndex # leetcode26. 删除有序数组中的重复项 # 给你一个升序排列的数组nums,请你原地删除重复出现的元素,使每个元素只出现一次,返回删除后数组的新长度。元素的相对顺序应该保持一致 。 # 由于在某些语言中不能改变数组的长度,所以必须将结果放在数组nums的第一部分。更规范地说,如果在删除重复项之后有k个元素,那么nums的前k个元素应该保存最终结果。 # 将最终结果插入 nums 的前 k 个位置后返回 k 。 # 不要使用额外的空间,你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下完成。 # # 示例 1: # 输入:nums = [1,1,2] # 输出:2, nums = [1,2,_] # 解释:函数应该返回新的长度 2 ,并且原数组nums的前两个元素被修改为1, 2 。不需要考虑数组中超出新长度后面的元素。 # # 示例 2: # 输入:nums = [0,0,1,1,1,2,2,3,3,4] # 输出:5, nums = [0,1,2,3,4] # 解释:函数应该返回新的长度 5 , 并且原数组nums的前五个元素被修改为0, 1, 2, 3, 4 。不需要考虑数组中超出新长度后面的元素。 # # 提示: # 1 <= nums.length <= 3 * 104 # -104 <= nums[i] <= 104 # nums 已按升序排列 # 双指针法 class Solution: def removeDuplicates(self, nums) -> int: slowIndex = 0 fastIndex = 1 n = len(nums) while fastIndex < n: if nums[slowIndex] == nums[fastIndex]: fastIndex += 1 else: slowIndex += 1 nums[slowIndex] = nums[fastIndex] fastIndex += 1 return slowIndex+1 # 283.移动零: # 给定一个数组nums,编写一个函数将所有0移动到数组的末尾,同时保持非零元素的相对顺序。 # 请注意,必须在不复制数组的情况下原地对数组进行操作。 # # 示例 # 输入: nums = [0, 1, 0, 3, 12] # 输出: [1, 3, 12, 0, 0] # 示例 # 输入: nums = [0] # 输出: [0] # 暴力法 class Solution: def moveZeroes(self, nums) -> None: i = 0 n = len(nums) while i < n: if nums[i] == 0: for j in range(i+1, n): nums[j-1] = nums[j] nums[j-1] = 0 i -= 1 n -= 1 i += 1 for i in range(n): print(nums[i]) if __name__ == '__main__': nums = [1,0,0,1,2] val = 2 print(Solution().moveZeroes(nums))
代码随想录 移除元素 LeetCode27:移除元素 leetcode26. 删除有序数组中的重复项 LeetCode283.移动零:
于 2022-11-11 14:52:53 首次发布