LeetCode 26: Remove Duplicates from Sorted Array

来源:互联网 发布:java数据结构与算法题 编辑:程序博客网 时间:2024/06/06 12:00

本博客与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;    }}
0 0
原创粉丝点击