题目要求:
给定排好顺序的数组,在数组内删除重复项,使每个元素只出现一次并返回不含重复项数组的长度。
不要为另一个数组分配额外的空间,保持空间复杂度是O(1)。
Example:
输入 [1,1,2] 输出:2
输入 [0,0,1,1,1,2,2,3,3,4] 输出:5
解题思路
对一个排好顺序的数组,我们只需要比较相邻的两个元素是否相同即可判断数组是否含有重复项。
在这里,为了方便,我们采用双指针法
用一个指针来从前到后对数组进行遍历,另一个指针来记录非重复元素的索引(通过当前遍历元素和下一个元素判断是否重复)。
需要注意的是数组为空的情况不要忘记。代码如下:
class Solution {
public:
int removeDuplicates(vector<int>& nums) {
if(nums.size()==0) return 0; // 数组为空
int record = 0; // 第一个指针记录非重复
for(int traverse = 1; traverse < nums.size(); traverse++)
{
// 判断当前元素是否重复
// if(nums[traverse] != nums[record]) is also true.
if(nums[traverse] != nums[traverse - 1])
nums[++record] = nums[traverse]; // 记录非重复元素,并且将记录指针向后移动。
}
return record + 1;
}
};
class Solution(object):
def removeDuplicates(self, nums):
"""
:type nums: List[int]
:rtype: int
"""
record = 0 # 记录非重复元素的位置
for i in range(1,len(nums)):
if nums[i] != nums[i-1]:
record= record + 1 # 发现不重复的位置,更新记录 不然[1,1,2]以就会变成[2,1]
nums[record] = nums[i]
return record + 1