这里提供两种解法
快慢指针(官方优解)
我在写这道题目的时候,读题不认真,没看到是排序这个条件,所以走了弯路,如果注意到这个条件思路还是比较简单的
i为慢指针,j为快指针,数组因为顺序排列,设i=0为第一个元素,第二个元素j如果不等于i,则将j赋值到++i个元素,如果相同,则继续遍历。只有不同的元素出现时才添加。
public static int removeDuplicates(int[] nums) {
if(nums.length==0)return 0;
int i=0;
for(int j=1;j<nums.length;j++){
if(nums[i]!=nums[j]){
nums[++i]=nums[j];
}
}
return i+1;
}
hash表解法(通解,不限于排序数组)
这个是我自己解这题的解法,运行时间没有上面那个块(3ms:1ms),但是内存消耗比那个还小
思路:
哈希表初为空,往哈希表里边放不重复的键值对(数组元素为key,数组下标为value。这么做是为了方便key比较是否重复)
用containsKey看是否重复 ,用一个size标记数的个数,然后将每个不重复的数从nums[0]开始依次赋值,于此同时将每个数放到map中,以供后面的数进行条件判断
public static int removeDuplicates(int[] nums) {
int size=0; //待返回的不重复元素个数
Map<Integer, Integer>map=new HashMap<Integer, Integer>(); //将不重复的数组元素往map中放
for (int i=0;i<nums.length;i++) {
if(!map.containsKey(nums[i])){
//同时用map的containsKey方法决定遍历元素是否在map中存在,从而决定是否往里边放
nums[map.size()]=nums[i]; //将这个不重复的数紧接着赋值到上一个的后边
map.put(nums[map.size()], i); //将这个数同时放到map中
size++;//有效数的个数+1
}
}
return size;
}