zoukankan      html  css  js  c++  java
  • LeetCode-26.Remove Duplicates from Sorted Array | 删除排序数组中的重复项

    题目

    Given a sorted array nums, remove the duplicates in-place such that each element appears only once and returns 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.

    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 a 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]);
    }
    
    Example 1:
    
    Input: nums = [1,1,2]
    Output: 2, nums = [1,2]
    Explanation: 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:
    
    Input: nums = [0,0,1,1,1,2,2,3,3,4]
    Output: 5, nums = [0,1,2,3,4]
    Explanation: 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.
    
    Constraints:
    0 <= nums.length <= 3 * 104
    -104 <= nums[i] <= 104
    nums is sorted in ascending order.
    

    题解

    这道题就是希望让我返回一个没有重复数字的数组的大小,且不要使用额外的数组空间,必须在原地修改输入数组 并在使用 O(1) 额外空间的条件下完成。

    解法一:暴力

    for循环从数组nums末尾的最后一个数字开始遍历,让数组nums末尾最后一个数字与末尾最后倒数第二个数字做比较,如果后一个等于前一个,则从数组中删除后一个元素,直到遍历完成,返回新数组的长度。

    //Go
    func removeDuplicates(nums []int) int {
    	for i:=len(nums)-1;i>0;i-- {
            if nums[i] == nums[i-1] {
                nums = append(nums[:i],nums[i+1:]...)
            }
        }
    
        return len(nums)
    }
    

    解法二:双指针法

    
    //Go
    func removeDuplicates(nums []int) int {
        if len(nums) == 0 {  //考虑特殊情况
            return 0
        }
        i := 0; //慢指针
        for j := 1;j < len(nums);j++ {  //j是快指针
            if nums[j] != nums[i] {
                i++
                nums[i] = nums[j]
            }
        }
        return i + 1
    }
    

    执行结果:

    leetcode-cn:
    执行用时:8 ms, 在所有 Go 提交中击败了86.25%的用户
    内存消耗:4.6 MB, 在所有 Go 提交中击败了65.76%的用户
    
    leetcode:
    Runtime: 4 ms, faster than 99.38% of Go online submissions for Remove Duplicates from Sorted Array.
    Memory Usage: 4.6 MB, less than 100.00% of Go online submissions for Remove Duplicates from Sorted Array.
    
             
    版权声明:本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明。
        
    特此声明:所有评论和私信都会在第一时间回复。也欢迎园子里和园子外的大大们指正错误,共同进步。或者直接私信我 (^∀^)
        
    声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是作者坚持原创和持续写作的最大动力!

    您的资助是我最大的动力!
    金额随意,欢迎来赏!

    如果,您认为阅读这篇博客让您有些收获,不妨点击一下右下角的推荐按钮。
    如果,您希望更容易地发现我的新博客,不妨点击一下绿色通道的关注我

    如果,想给予我更多的鼓励,求打

    本博客的所有打赏均将用于博主女朋友的化妆品购买以及养肥计划O(∩_∩)O。我是【~不会飞的章鱼~】!

    联系或打赏博主【~不会飞的章鱼~】!https://www.cnblogs.com/OctoptusLian/

  • 相关阅读:
    [转] Spring的session管理
    C# 屏幕截图
    C#数字图像处理图像旋转图片加角度
    C#委托
    C# HttpWebRequest 添加Cookie验证
    网站
    前端获取URL中的值
    从下往上画的文字
    测试SSL的网站
    Tomcat-绑定证书的两种方法
  • 原文地址:https://www.cnblogs.com/OctoptusLian/p/14394713.html
Copyright © 2011-2022 走看看