给定一个排序数组,你需要在 原地 删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度。 不要使用额外的数组空间,你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下完成。

2021-04-07 11:08:59 浏览数 (1)

代码语言:javascript复制
给定数组 nums = [1,1,2], 

函数应该返回新的长度 2, 并且原数组 nums 的前两个元素被修改为 1, 2。 

你不需要考虑数组中超出新长度后面的元素。
================================
关于此类的题目,提取有效信息,有序数组,应该想到利用双指针来进行处理;
我们需要跳过重复的元素,然后遇到非重复元素进行覆盖操作
解法1.
代码语言:javascript复制
 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进行存储

这个实现有点慢,好歹也是自己第一次的解题思路,多一种思路未尝不可

代码语言:javascript复制
 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     }

0 人点赞