题目地址:Remove Duplicates from Sorted Array
题目简介:
给定一个排序数组,需要在原地删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度。
不要使用额外的数组空间,必须在原地修改输入数组并在使用O(1)额外空间的条件完成。
示例:
Example 1:
Given nums = [1,1,2],
Your function should return length = 2, with the first two elements of nums being 1 and 2 respectively.
It doesn't matter what you leave beyond the returned length.
Example 2:
Given nums = [0,0,1,1,1,2,2,3,3,4],
Your function should return length = 5, with the first five elements of nums being modified to 0, 1, 2, 3, and 4 respectively.
It doesn't matter what values are set beyond the returned length.
题目解析:
1、暴力解决:记第i个数为,如果,那么便把删除,继续与下一个对比。
C++版:
class Solution {
public:
int removeDuplicates(vector<int>& nums) {
if (nums.size() < 2)
return nums.size();
int size = nums.size();
int temp = nums[0];
vector<int>::iterator it = nums.begin() + 1;
while (it != nums.end())
{
if (temp != *it)
{
temp = *it;
it++;
}
else
{
nums.erase(it);
}
}
return nums.size();
}
};
2、双指针法:两个指针是指一个跑得慢,用来记住当前出现的最大值,另一个跑得快,消灭和跑得慢的值相同的值。
C++版:
class Solution {
public:
int removeDuplicates(vector<int>& nums) {
if (nums.size() < 2)
return nums.size();
int j = 0; //用来存储跑的慢的
for (int i = 0; i < nums.size();)
{
if (nums[i] != nums[j])
{
j++;
nums[j] = nums[i];
i++;
}
else
i++;
}
return j + 1;
}
};
Python版本:
class Solution:
def removeDuplicates(self, nums: List[int]) -> int:
if (len(nums) < 2):
return len(nums)
i = j = 0
while (i < len(nums)):
if nums[j] != nums[i]:
j += 1
nums[j] = nums[i]
i += 1
else:
i += 1
return j + 1