当前位置:   article > 正文

力扣(leetcode) 26. 删除有序数组中的重复项 (图解双指针算法)_删除有序数组重复元素双坐标法

删除有序数组重复元素双坐标法

题目在这:https://leetcode-cn.com/problems/remove-duplicates-from-sorted-array/

题目分析:

这道题需要注意的地方,在leetcode上返回的时候,要返回一个int型数字。他会在内部变成 ‘取数组的前几位’ 然后输出一个数组。

相当于这个:

for (int i = 0; i < len; i++) {
    print(nums[i]);
}
  • 1
  • 2
  • 3

上面是官方解释,C语言。相当于python里的nums[:len] 就是取前len位。

思路分析:

学过数据结构的小伙伴应该很快能想到用双指针法。

1. 我们首先设立两个指针指向第一位数和第二位数(也可以同时指向第一位数,原理不变)。
在这里插入图片描述

2. 比较两个指针所指向值的大小,如果两者相等则让right指针往后移动。
在这里插入图片描述
3. 移动后再次比较两指针所指向的数值,不相等。则此时让left指针向后挪一位。并让right的值赋值给left。
在这里插入图片描述
在这里插入图片描述
4. 再让right往后挪动一位。然后比较两指针的值。
两指针的值相等,继续让right往后挪,left不动,直到right挪动到与left值不同的时候。重复上面步骤。
在这里插入图片描述

完整代码:

nums = [0,0,1,1,1,2,2,3,3,4]
n = len(nums)
index = 0
for i in range(n):
    if nums[i] != nums[index]:
        index += 1
        nums[index] = nums[i]
print(nums[:index + 1])

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

这里我所设置的index就相当于上面的left,循环中的i就相当于上面的right。
不必照抄代码。可以看懂思想用自己的方法模拟一下这个过程。

leetcode提交的时候。以往都是将调试时候的print改成return就行了。而这道题的原因,吧最后一句改成:
return index+1 (原因在开头的题目分析里)

在这里插入图片描述

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/article/detail/50528
推荐阅读
相关标签
  

闽ICP备14008679号