数组去重-哈希-快慢指针

简介: 数组去重的方式有多种,下面介绍两种

数组去重的方式有多种,下面介绍两种


待操作数组用 数组a 表示

处理好的数组用 数组res 表示

Hash 哈希去重

思路:


利用Map不能存储相同数值的原理

取得所有键值存入数组,即去重后的返回值

public static int[] delSame(int[] a){
  Map<Integer,Integer> map = new HashMap<>();
        for (int num:a) {
            map.put(num,1);
        }
        Set<Integer> set = map.keySet();
        int[] res=new int[map.size()];
        Iterator<Integer> iterator = set.iterator();
        int i=-1;
        while (iterator.hasNext()){
            res[++i]=iterator.next();
        }
        return res;
}


快慢指针去重

思路:


对数组进行排序

借助快慢指针 i 和 j ,让 i 始终指向不重复的数据的下标作为慢指针,让 j 一直遍历数组,寻找重复的数值

找到重复的数值就让 j++ 跳过

完整代码:

public static int[] delSame(int[] a){
        //1.排序
        Arrays.sort(a);
        //2.去重
        int n=a.length;
        int[] res=new int[n];   //存放返回值,即去重后的数组
        if(n==1){   //极端案例
            res[0]=a[0];
            return res;
        }
        int i=0;    //慢指针
        int j=0;    //快指针
        int temp=-1;
        int num1 = a[i];    //指针i指向的值
        int num2 = a[j];    //指针j指向的值
        while (j<n) {   //只要j不越界就一直执行,但由于循环体中有多个++j,所以循环体内也应该判断以防越界
            res[++temp]=num1; //每循环一次num1更新一次且不是重复值
            //防止越界
            int t = j+1;
            if(t==n){
                break;
            }
            num2 = a[++j];  //更新 j
            while(num2 == num1){//如果重复就让j++
                if(j==n-1){     //防止越界
                    break;
                }
                num2=a[++j];
            }
            num1=a[j];
        }
        int size = temp+1;  //发现去重后的数组大小 size=temp+1
        int[] ans = new int[size];
        for (int k = 0; k < size; k++) {
            ans[k]=res[k];
        }
        return ans;
    }



看似复杂,主要是判断越界的地方影响思维

核心代码:


while(j<n){
  res(++temp)=num1;
  num2=a[++j];
  while(num1==num2){
  num2=a[++j];
  }
  num1=num2;
}
相关文章
|
6月前
|
算法
LeetCode刷题---19. 删除链表的倒数第 N 个结点(双指针-快慢指针)
LeetCode刷题---19. 删除链表的倒数第 N 个结点(双指针-快慢指针)
|
6月前
快慢指针之:链表中倒数第k个结点
快慢指针之:链表中倒数第k个结点
|
4天前
|
算法 索引
单链表题+数组题(快慢指针和左右指针)
单链表题+数组题(快慢指针和左右指针)
9 1
|
5月前
|
算法
【经典LeetCode算法题目专栏分类】【第7期】快慢指针与链表
【经典LeetCode算法题目专栏分类】【第7期】快慢指针与链表
|
6月前
|
算法 C语言 索引
环形链表(快慢指针)
环形链表(快慢指针)
|
6月前
数据结构--链表刷题(一)快慢指针(下)
数据结构--链表刷题(一)快慢指针
42 0
|
6月前
数据结构--链表刷题(一)快慢指针(上)
数据结构--链表刷题(一)快慢指针
52 0
|
6月前
|
算法 Java
快慢指针该如何操作?本文带你认识快慢指针常见的三种用法及在链表中的实战
快慢指针该如何操作?本文带你认识快慢指针常见的三种用法及在链表中的实战
94 0
|
6月前
|
存储 算法
LeetCode刷题--- 61. 旋转链表(快慢指针+闭合为环)
LeetCode刷题--- 61. 旋转链表(快慢指针+闭合为环)
|
6月前
|
算法 索引
LeetCode刷题---142. 环形链表 II(双指针-快慢指针)
LeetCode刷题---142. 环形链表 II(双指针-快慢指针)