原题目
Given a sorted array nums, remove the duplicates in-placesuch that each element appear only once and return the new length.
Do not allocate extra space for another array, you must do this by modifying the input array in-place with O(1) extra memory.
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.
Clarification:
Confused why the returned value is an integer but your answer is an array?
Note that the input array is passed in by reference, which means modification to the input array will be known to the caller as well.
Internally you can think of this:
// nums is passed in by reference. (i.e., without making a copy) int len = removeDuplicates(nums); // any modification to nums in your function would be known by the caller. // using the length returned by your function, it prints the first len elements. for (int i = 0; i < len; i++) { print(nums[i]); }
思路
因为是数组存储,修改值是很麻烦的,因此考虑用set处理去除相同元素
第一遍解法
# 失败
# 题目说明不能新开辟空间,这种方法新开辟空间修改指针了
class Solution:
def removeDuplicates(self, nums):
nums = list(set(nums))
return len(nums)
网上好的解法
int count = 0;
for(int i = 1; i < n; i++){
if(A[i] == A[i-1]) count++;
else A[i-count] = A[i];
}
return n-count;
class Solution:
def removeDuplicates(self, nums):
if nums == None or len(nums) == 0:
return -1
count = 1
for i in range(1, len(nums)):
if nums[i] != nums[i-1]:
nums[count] = nums[i]
count += 1
return count
自己可以改进的地方
最简代码
获得的思考
对比83题Remove Duplicates from Sorted List
class Solution:
def deleteDuplicates(self, head):
while head and head.next: # 链表长度大于等于2时
node = head
while node.next:
if node.val == node.next.val:
node.next = node.next.next
else:
node = node.next
return head
return head # 链表长度小于2时直接返回
-
对于有序链表,去除重复结点的方法是从前往后,前一个结点和后一个结点相同时跳过后一个结点指向后一个节点的下一个结点。
-
而对于有序数组,去除重复值的方法是从后往前,用两个指针p、q分别指示数组下标和不重复元素(的下一个)下标。将不重复的值依次赋值给q指针元素然后指针后移,最终q指向不重复的下一个元素。