题目:给定一个排序树组,你需要在原地删除重复的元素,使得每个元素只出现一次,返回移除后数组的新长度。不要使用额外的数组空间,你必须在原地修改输入数组并在使用No.26 删除有序数组中的重复项 - 图1额外空间的条件下完成。
    例:

    1. 给定数组 nums = [1,1,2],
    2. 函数应该返回新的长度 2, 并且原数组 nums 的前两个元素被修改为 1, 2
    3. 你不需要考虑数组中超出新长度后面的元素。
    1. 给定 nums = [0,0,1,1,1,2,2,3,3,4],
    2. 函数应该返回新的长度 5, 并且原数组 nums 的前五个元素被修改为 0, 1, 2, 3, 4
    3. 你不需要考虑数组中超出新长度后面的元素。

    题解:
    一、双指针

    1. class Solution:
    2. def removeDuplicates(self, nums: List[int]) -> int:
    3. a = 0
    4. b = 1
    5. while b < len(nums):
    6. if nums[b] == nums[a]:
    7. b += 1
    8. else:
    9. a += 1
    10. nums[a] = nums[b]
    11. return a+1
    12. 作者:yi-wen-statistics
    13. 链接:https://leetcode-cn.com/problems/remove-duplicates-from-sorted-array/solution/shuang-zhi-zhen-by-yi-wen-statistics/
    14. 来源:力扣(LeetCode
    15. 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

    知识点:
    双指针
    指的是在遍历对象的过程中,不是普通的使用单个指针进行访问,而是使用两个相同方向(快慢指针)或者相反方向(对撞指针)的指针进行扫描,利用数组有序的特性,达到简化运算的目的。
    对撞指针是指在有序数组中,将指向最左侧的索引定义为左指针(left),最右侧的定义为右指针(right),然后从两头向中间进行数组遍历。

    1. function fn (list) {
    2. var left = 0;
    3. var right = list.length - 1;
    4. //遍历数组
    5. while (left <= right) {
    6. left++;
    7. // 一些条件判断 和处理
    8. ... ...
    9. right--;
    10. }
    11. }

    快慢指针也是双指针,但是两个指针从同一侧开始遍历数组,将这两个指针分别定义为快指针(fast)慢指针(slow),两个指针以不同的策略移动,直到两个指针的值相等(或其他特殊条件)为止,如fast每次增长两个,slow每次增长一个。本题采用的解法就是快慢指针

    二、pop()

    1. class Solution:
    2. def removeDuplicates(self, nums: List[int]) -> int:
    3. a = 0
    4. b = 1
    5. while b < len(nums):
    6. if nums[a] == nums[b]:
    7. nums.pop(a)
    8. else:
    9. a += 1
    10. b += 1
    11. return len(nums)
    12. 作者:yi-wen-statistics
    13. 链接:https://leetcode-cn.com/problems/remove-duplicates-from-sorted-array/solution/shuang-zhi-zhen-by-yi-wen-statistics/
    14. 来源:力扣(LeetCode
    15. 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

    仍然是快慢指针,只不过是用pop来删去重复元素,前一种是通过赋值来前移不同元素。
    **