LeetCode 26: Remove Duplicates from Sorted Array
2016-02-28 21:16
323 查看
本博客与RayXXZhang的博客保持同步更新,转载请注明来自RayXXZhang的博客-LeetCode 26: Remove Duplicates from Sorted Array
Do not allocate extra space for another array, you must do this in place with constant memory.
For example,
Given input array nums =
Your function should return length =
时间复杂度O(nlogn),优于解法一
该解法只需要一次遍历,无需而外的排序,时间复杂度O(n),是最优解法。
题目
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
1and
2respectively. 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; } }
相关文章推荐
- leetcode 179 Largest Number
- leetcode 24 Swap Nodes in Pairs
- leetcode 2 Add Two Numbers 方法1
- leetcode 2 Add Two Numbers 方法2
- leetcode----Longest Substring Without Repeating Characters
- [LeetCode]47 Permutations II
- [LeetCode]65 Valid Number
- [LeetCode]123 Best Time to Buy and Sell Stock III
- [LeetCode] String Reorder Distance Apart
- [LeetCode] Sliding Window Maximum
- [LeetCode] Find the k-th Smallest Element in the Union of Two Sorted Arrays
- [LeetCode] Determine If Two Rectangles Overlap
- [LeetCode] A Distance Maximizing Problem
- leetcode_linearList
- leetcode_linearList02
- 021-Merge Two Sorted Lists(合并两个排好序的单链表);leetcode
- LeetCode[Day 1] Two Sum 题解
- LeetCode[Day 2] Median of Two Sorted Arrays 题解
- LeetCode[Day 3] Longest Substring Without... 题解
- LeetCode [Day 4] Add Two Numbers 题解