题目:给定一个排序树组,你需要在原地删除重复的元素,使得每个元素只出现一次,返回移除后数组的新长度。不要使用额外的数组空间,你必须在原地修改输入数组并在使用额外空间的条件下完成。
例:
给定数组 nums = [1,1,2],函数应该返回新的长度 2, 并且原数组 nums 的前两个元素被修改为 1, 2。你不需要考虑数组中超出新长度后面的元素。
给定 nums = [0,0,1,1,1,2,2,3,3,4],函数应该返回新的长度 5, 并且原数组 nums 的前五个元素被修改为 0, 1, 2, 3, 4。你不需要考虑数组中超出新长度后面的元素。
题解:
一、双指针
class Solution:def removeDuplicates(self, nums: List[int]) -> int:a = 0b = 1while b < len(nums):if nums[b] == nums[a]:b += 1else:a += 1nums[a] = nums[b]return a+1作者:yi-wen-statistics链接:https://leetcode-cn.com/problems/remove-duplicates-from-sorted-array/solution/shuang-zhi-zhen-by-yi-wen-statistics/来源:力扣(LeetCode)著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
知识点:
双指针
指的是在遍历对象的过程中,不是普通的使用单个指针进行访问,而是使用两个相同方向(快慢指针)或者相反方向(对撞指针)的指针进行扫描,利用数组有序的特性,达到简化运算的目的。
对撞指针是指在有序数组中,将指向最左侧的索引定义为左指针(left),最右侧的定义为右指针(right),然后从两头向中间进行数组遍历。
function fn (list) {var left = 0;var right = list.length - 1;//遍历数组while (left <= right) {left++;// 一些条件判断 和处理... ...right--;}}
快慢指针也是双指针,但是两个指针从同一侧开始遍历数组,将这两个指针分别定义为快指针(fast)和慢指针(slow),两个指针以不同的策略移动,直到两个指针的值相等(或其他特殊条件)为止,如fast每次增长两个,slow每次增长一个。本题采用的解法就是快慢指针
二、pop()
class Solution:def removeDuplicates(self, nums: List[int]) -> int:a = 0b = 1while b < len(nums):if nums[a] == nums[b]:nums.pop(a)else:a += 1b += 1return len(nums)作者:yi-wen-statistics链接:https://leetcode-cn.com/problems/remove-duplicates-from-sorted-array/solution/shuang-zhi-zhen-by-yi-wen-statistics/来源:力扣(LeetCode)著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
仍然是快慢指针,只不过是用pop来删去重复元素,前一种是通过赋值来前移不同元素。
**
