leetcode刷题
面试经典150
26. 删除有序数组中的重复项
难度:简单
文章目录
一、题目内容
给你一个 非严格递增排列 的数组 n u m s nums nums ,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。元素的 相对顺序 应该保持 一致 。然后返回 nums 中唯一元素的个数。
考虑 nums 的唯一元素的数量为 k k k ,你需要做以下事情确保你的题解可以被通过:
- 更改数组 n u m s nums nums ,使 n u m s nums nums 的前 k k k 个元素包含唯一元素,并按照它们最初在 n u m s nums nums 中出现的顺序排列
- n u m s nums nums 的其余元素与 n u m s nums nums 的大小不重要
- 返回 k 。
二、自己实现代码
2.1 两个指针
2.1.1 实现思路
- 考虑指针a和指针b,指向的元素是否相等,依据是否相等做下一步判断
因为没有考虑到 a和a-1比较,所以思路很复杂繁琐,在这里就不写了,直接写,后面想到的第二个双指针方法
2.2 方法二:排序整体删除再补充
2.2.1 实现思路
- 两个指针
- i :用来遍历整个list的快指针
- b 用来计算有多少个不同数目的指针
如果两个元素不一样,那么当前b的位置的值等于i位置的值,并且b往后移动一位
2.2.2 实现代码
class Solution(object):
def removeDuplicates(self, nums):
"""
:type nums: List[int]
:rtype: int
"""
b = 1
for i in range(1, len(nums)):
if nums[i] != nums[i-1]:
nums[b] = nums[i]
b += 1
return b
2.2.3 结果分析
三、 官方解法
用的是自己实现的法二
所以,证明写题还是有必要的
算法思维确实有在精简和提高了
四、一些注意的地方
- 多想一想双指针,用下来真的会方便好多
- 在比较的时候,可以考虑 nums[a]和nums[a-1]比较
- 一开始的时候,设置a=1,
- 这样不会超出限制又可以比较所有元素