zoukankan      html  css  js  c++  java
  • LeetCode 26. 删除排序数组中的重复项

    又到了刷题的时候了,没办法,没事做的时候,太无聊了。

    题目:


    给定一个排序数组,你需要在 原地 删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度。

    不要使用额外的数组空间,你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下完成。

    示例 1:

    给定数组 nums = [1,1,2], 
    
    函数应该返回新的长度 2, 并且原数组 nums 的前两个元素被修改为 1, 2。 
    
    你不需要考虑数组中超出新长度后面的元素。
    

    示例 2:

    给定 nums = [0,0,1,1,1,2,2,3,3,4],
    
    函数应该返回新的长度 5, 并且原数组 nums 的前五个元素被修改为 0, 1, 2, 3, 4。
    
    你不需要考虑数组中超出新长度后面的元素。
    

    说明:

    为什么返回数值是整数,但输出的答案是数组呢?

    请注意,输入数组是以「引用」方式传递的,这意味着在函数里修改输入数组对于调用者是可见的。

    你可以想象内部操作如下:

    // nums 是以“引用”方式传递的。也就是说,不对实参做任何拷贝
    int len = removeDuplicates(nums);
    
    // 在函数里修改输入数组对于调用者是可见的。
    // 根据你的函数返回的长度, 它会打印出数组中该长度范围内的所有元素。
    for (int i = 0; i < len; i++) {
        print(nums[i]);
    }
    

    思路:

    重点是不能使用额外的数组空间,浅拷贝算吗?不知道,都写下来吧。

    方法一:

    基本的数组去重方法。

    class Solution(object):
        def removeDuplicates(self, nums):
            """
            :type nums: List[int]
            :rtype: int
            """
            num2 = nums[:]
            for key in num2:
                if (nums.count(key) == 1):
                    continue
                else:
                    nums.remove(key)
            return len(nums)
    

    方法二:

    第一时间想到的是这样做,但感觉用set和sortedd不符合题意,因为sorted返回的是新数组,还是写一下记录好了。

    class Solution(object):
        def removeDuplicates(self, nums):
            """
            :type nums: List[int]
            :rtype: int
            """
            nums[:] = sorted(set(nums))
            return len(nums)
    

    方法三:

    双重遍历,也不符合O要求·····只是记录下。

    class Solution(object):
        def removeDuplicates(self, nums):
            """
            :type nums: List[int]
            :rtype: int
            """
            for i in nums:
                i_nums =nums.count(i)
                while i_nums > 1:
                    nums.remove(i)
                    i_nums -= 1
            return len(nums)
    

    方法四:

    双指针移动,用for循环遍历或者是while ,对数组过滤筛选,返回i+1即可。

    class Solution(object):
        def removeDuplicates(self, nums):
            """
            :type nums: List[int]
            :rtype: int
            """
            n = len(nums)
            if n <=1 : return n
            i,j = 0,1
            for idx in range(n-1):
                if nums[i] == nums[j]:
                    j += 1
                    continue
                else:
                    i += 1
                    nums[i] = nums[j]
                    j += 1            
            return i+1
    
    class Solution(object):
        def removeDuplicates(self, nums):
            """
            :type nums: List[int]
            :rtype: int
            """
            n = len(nums)
            if n <=1 : return n
            i,j = 0,1
            while j < n:
                if nums[i] == nums[j]:
                    j += 1
                else:
                    i += 1
                    nums[i] = nums[j]
                    j += 1            
            return i+1
    

    方法五:

    pop对原数组进行操作了 ,这样,也应该不符合要求。

    class Solution(object):
        def removeDuplicates(self, nums):
            """
            :type nums: List[int]
            :rtype: int
            """
            a = 0
            b = 1
            while b < len(nums):
                if nums[a] == nums[b]:
                    nums.pop(a)
                else:
                    a += 1
                    b += 1
            return len(nums)
    
  • 相关阅读:
    Android开发总结
    LeakCanary原理分析
    机器学习
    Kivy 中文教程 实例入门 简易画板 (Simple Paint App):2. 实现绘图功能
    Python 零基础 快速入门 趣味教程 (咪博士 海龟绘图 turtle) 3. 循环
    Kivy 中文教程 实例入门 简易画板 (Simple Paint App):1. 自定义窗口部件 (widget)
    Python 零基础 快速入门 趣味教程 (咪博士 海龟绘图 turtle) 2. 变量
    Python 零基础 快速入门 趣味教程 (咪博士 海龟绘图 turtle) 1. 神秘朋友
    Python 零基础 快速入门 趣味教程 (咪博士 海龟绘图 turtle) 0. 准备工作
    远程显示(操作) 服务器 GUI 程序(图形化界面) (基于 X11 Forwarding + Centos + MobaXterm)
  • 原文地址:https://www.cnblogs.com/xiaoqiangink/p/14273002.html
Copyright © 2011-2022 走看看