给定一个排序数组,你需要在 原地 删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度。 不要使用额外的数组空间,你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下完成。
Posted on 2020-03-18 23:43 豆豆2018 阅读(626) 评论(0) 编辑 收藏 举报给定数组 nums = [1,1,2], 函数应该返回新的长度 2, 并且原数组 nums 的前两个元素被修改为1
,2
。 你不需要考虑数组中超出新长度后面的元素。
================================
关于此类的题目,提取有效信息,有序数组,应该想到利用双指针来进行处理;
我们需要跳过重复的元素,然后遇到非重复元素进行覆盖操作
解法1.
1 public static int removeRepeat(int[] array){ 2 int len = array.length; 3 int temp = 0; 4 5 if (len == 0 ){ 6 return 0; 7 }else { 8 for (int i = 0; i < len; i++) { 9 if (array[temp] != array[i]){ 10 array[++temp] = array[i]; 11 } 12 13 } 14 15 return temp+1; 16 17 } 18 19 20 21 }
2.去重,可以利用map进行操作,以 array[i] -- i, 进行存储,这样可以起到去重的效果,然后我们遍历一遍数据,进行替换覆盖就可以了;
注意,hashmap是非顺序存储的,我们需要保证数组的有序排列,所以需要用到有存储顺序的linkedhashmap进行存储
这个实现有点慢,好歹也是自己第一次的解题思路,多一种思路未尝不可
1 public static int removeDuplicates(int[] nums) { 2 LinkedHashMap<Integer, Integer> hashMap = new LinkedHashMap<>(); 3 for (int i = 0; i < nums.length; i++) { 4 hashMap.put(nums[i],i); 5 } 6 int index = 0; 7 for (Map.Entry<Integer, Integer> entry:hashMap.entrySet()) { 8 Integer key = entry.getKey(); 9 nums[index] = key; 10 index++; 11 } 12 return index; 13 }