Java删除有序数组的重复元素
题目描述
提示:
方法一
使用Java自带的LinkedHashMap
先把数组的值存放在集合中,再把集合的元素取出来,把原数组的内容进行覆盖
class Solution {
public int removeDuplicates(int[] nums) {
LinkedHashMap<Integer,Boolean> map = new LinkedHashMap<>();
for(int i = 0;i<nums.length;i++){
map.put(nums[i],true);
}
int i = 0;
for(Integer key:map.keySet()){
nums[i++] = key;
}
return map.size();
}
}
运行截图
但是此方法比较费时间
方法二
利用数组,由于元素是有序所以只需要判断当前元素与前一个元素的值是否相同,不同则覆盖。
class Solution {
public int removeDuplicates(int[] nums) {
int index = 0;
for(int i=0;i<nums.length;i++){
if(i==0||nums[i]!=nums[i-1]){
nums[index++] = nums[i];
}
}
return index;
}
}
运行截图
方法三
用双指针
1.首先进行判空
数组为空的时候,返回0;
2.设置两个指针:
第一个指针为p=0指向第一个元素
第二个指针为q=1指向第二个元素
3.如果前后相邻元素不同,p指针向后移动
如果前后相邻元素相同,q指针向后移动
4.返回数组的长度为p+1
class Solution {
public int removeDuplicates(int[] nums) {
if(nums==null||nums.length==0) return 0;
int p = 0;
int q = 1;
while(q<nums.length){
if(nums[q]!=nums[p]){
if(q-p>1){
nums[p+1] = nums[q];
}
p++;
}else{
q++;
}
}
return p+1;
}
}
运行截图