LeetCode 26: Remove Duplicates from Sorted Array

本博客与RayXXZhang的博客保持同步更新,转载请注明来自RayXXZhang的博客-LeetCode 26: Remove Duplicates from Sorted Array

题目

Given a sorted array, remove the duplicates in place such that each element appear only once and return the new length.

Do not allocate extra space for another array, you must do this in place with constant memory.

For example,
Given input array 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 new length.

解题思路

这道题是一道简单题,通过比较容易,但是不同解法还是存在着一些效率差别的。

解法一

解法一判断在相邻的两个数相等的情况下,后面的所有数字往前移位,虽然能通过,但是效率较低,时间复杂度O(n^2)。

public class Solution {
    public int removeDuplicates(int[] nums) {
        int len = nums.length;
        int unique = len;
        for(int i = 0; i < unique - 1;) {
            if(nums[i] == nums[i + 1]) {
                for(int j = i + 1; j < unique; ++j) {
                    nums[j - 1] = nums[j];
                }
                --unique;
            } else {
                ++i;
            }
        }
        return unique;
    }
}

解法二

解法二将重复的数字填充成Integer.MAX_VALUE,然后再最后对数组进行排序即可,解法二使用最后的排序代替了遍历中的不断移位
时间复杂度O(nlogn),优于解法一

public class Solution {
    public int removeDuplicates(int[] nums) {
        int len = nums.length;
        int unique = len;
        for(int i = 0; i < len - 1; ++i) {
            if(nums[i] == nums[i + 1]) {
                nums[i] = Integer.MAX_VALUE;
                --unique;
            }
        }
        Arrays.sort(nums);
        return unique;
    }
}

解法三

解法三使用了两个游标,分别指向当前不重复的尾部和要进行比较的头部,当两者不同时,将比较的头部的数复制到当前不重复的尾部的后一个位置,
该解法只需要一次遍历,无需而外的排序,时间复杂度O(n),是最优解法。

public class Solution {
    public int removeDuplicates(int[] nums) {
        int len = nums.length;
        int i = 0;
        for(int j = 1; j < len; ++j) {
            if(nums[i] != nums[j]) {
                ++i;
                nums[i] = nums[j];
            }
        }
        return i + 1;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值