版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/majichen95/article/details/85226831
给一个整数数组,去除重复的元素。
你应该做这些事
1.在原数组上操作
2.将去除重复之后的元素放在数组的开头
3.返回去除重复元素之后的元素个数
样例
给出 nums = [1,3,1,4,4,2]
,你需要做以下操作
1.将重复元素扔在最后面 => nums = [1,3,4,2,?,?]
.
2.返回个数 4
实际上我们并不在意?
是什么
挑战
1.O(n)时间复杂度.
2.O(nlogn)时间复杂度但没有额外空间
注意事项
不需要保持原数组的顺序
解题思路1:
常见的思路是使用Map存储。时间复杂度O(n),空间复杂度O(n)
public class Solution {
/**
* @param nums: an array of integers
* @return: the number of unique integers
*/
public int deduplication(int[] nums) {
// write your code here
Map<Integer,Integer> map = new HashMap<>();
int i=0;
int j=nums.length-1;
for(; i<=j; ){
if(map.get(nums[i]) == null)
map.put(nums[i], 1);
else
map.put(nums[i], map.get(nums[i])+1);
if(map.get(nums[i]) > 1){
swap(nums, i, j--);
}else{
i++;
}
}
return map.size();
}
private void swap(int[] nums, int i, int j){
int temp = i;
nums[i] = nums[j];
nums[j] = temp;
}
}
解题思路2:
使用同向快慢指针。排序后用双指针。一个快指针一直往前走,慢指针先不动。当快指针发现它指向的数和慢指针不一样,就把该数丢给慢指针的后一个位置。慢指针++。最后返回慢指针的值+1。这个思路很不错。
时间复杂度O(nlogn),空间复杂度O(1)
public static int deduplication(int[] nums){
Arrays.sort(nums);
int i=0, j=1;
while(j < nums.length){
if(nums[j] != nums[i]){
swap(nums, ++i, j);
}
j++;
}
return i+1;
}
private static void swap(int[] nums, int i, int j){
int temp = nums[j];
nums[j] = nums[i];
nums[i] = temp;
}