leetcode 腾讯精选练习(50 题)26.删除排序数组中的重复项

原题目

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指向不重复的下一个元素。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值