Leetcode 题解|26. 删除排序数组中的重复项

栏目: 编程工具 · 发布时间: 7年前

内容简介:给定一个排序数组,你需要在不要使用额外的数组空间,你必须在

26. 删除 排序 数组中的重复项 -> Link

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

不要使用额外的数组空间,你必须在 原地修改输入数组 并在使用 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]);
}
复制代码

题目分析

本题中涉及到了 原地 的感念,是一种使用小的,固定数量的额外之空间来转换资料的算法。当算法执行时, 输入的资料通常会被要输出的部份覆盖掉

如果不注意题干的话,这个题很容易可以使用Set或者Hash来去重。但是使用Set和Hash都会开辟新的内存空间。增加空间复杂度,这里可以用到双指针法。

  1. 首先判断传入数组不为空且长度大于一;
  2. 定义新的数组的长度newLength,从0开始,慢指针;
  3. 遍历数组,定义快指针i;
  4. 当num[i] == num[newLength],慢指针newLength不变,快指针i+1。跳过重复项。
  5. 当num[i] != num[newLength], 慢指针newLength+1,快指针i+1,nums[newLength] = nums[i]。
  6. 重复相同过程直到循环结束。

复杂度分析

  • 时间复杂度: O(n) , 假设数组总共有  n  个元素,i 和 j 至少遍历  2n  步。
  • 空间复杂度: O(1)

Java

class Solution {
    public int removeDuplicates(int[] nums) {
        
        if (nums == null || nums.length == 0) {
            return 0;
        }
        
        int newLength = 1;
           
        for (int i = 1; i<nums.length; i++) {
            
            if (nums[i] != nums[i-1]) {
                nums[newLength++] = nums[i];
            }
        }
        return newLength;    
    }
}
复制代码

Swift

func removeDuplicates(_ nums: inout [Int]) -> Int {
        guard nums.count > 0 else {
            return 0
        }
        var newLength = 1;
        for idx in 1 ..< nums.count {
            
            if nums[idx] != nums[idx - 1] {
                nums[newLength] = nums[idx]
                newLength += 1
            }
        }
        return newLength
}
复制代码

JavaScript

var removeDuplicates = function(nums) {
    
    if (nums === 'undefined' || nums.length === 0) {
        return 0
    }
    var i = 1;
    for (var j = 1; j < nums.length; j++) {
        
        if (nums[j] != nums[j - 1]) {
            nums[i] = nums[j];
            i++;
        }
        
    }
    return i;
    
};复制代码

以上所述就是小编给大家介绍的《Leetcode 题解|26. 删除排序数组中的重复项》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

A Guide to Monte Carlo Simulations in Statistical Physics

A Guide to Monte Carlo Simulations in Statistical Physics

Landau, David P./ Binder, Kurt / Cambridge Univ Pr / 2005-9 / 786.00元

This new and updated edition deals with all aspects of Monte Carlo simulation of complex physical systems encountered in condensed-matter physics, statistical mechanics, and related fields. After brie......一起来看看 《A Guide to Monte Carlo Simulations in Statistical Physics》 这本书的介绍吧!

RGB转16进制工具
RGB转16进制工具

RGB HEX 互转工具

UNIX 时间戳转换
UNIX 时间戳转换

UNIX 时间戳转换

HSV CMYK 转换工具
HSV CMYK 转换工具

HSV CMYK互换工具