您好,欢迎来到华佗小知识。
搜索
您的当前位置:首页有序数组的双指针去重

有序数组的双指针去重

来源:华佗小知识

问题描述 :存在一个升序数组,将数组中的重复数据去除,且原有的顺序不变。

问题分析:

    1.已知数组升序,那么存在的重复数据一定物理相邻。

    2.数组去重即将所有非重复元素前置。

    3.可设置两个指针,快指针用来查询数据,慢指针用来数据对照。   

具体实现:

  #include <stdio.h>
int removeDuplicates(int* arr,int length);
int main(){
    int arr[6] = {1,1,2,2,2,3};
    int length = sizeof(arr)/sizeof(arr[0]);
    int i;
    int newLength = removeDuplicates(arr,length);
    printf("%d\n",newLength);
    for(i = 0; i < newLength; i++){
        printf("%d ",arr[i]);
    }
    return 0;
}
int removeDuplicates(int arr[],int length){
    if(!arr || length <     1) return 0; //数组不存在或者空数组
     int p = 0, q = 1;//双指针,p q
     while(q < length){
         //当 q>length时说明后面全都是重复项了,无需再去除 
         if(arr[q] != arr[p]){
             if(q - p > 1){
                 //找到不重复项
             arr[p+1] = arr[q];
             }
             //p++,开始排除下一个元素的重复项 
             p++;
         }
         q++;
     } 
     return p+1; //返回p之前元素个数 

代码说明:快指针q用来搜寻与慢指针p所指示的数据不同的数据,当搜寻到时,就将其放至p之后,实现非重复数据的迁移;慢指针p用来指示当前需要去重的数据。

细节说明:

   1.当数组不存在或者数组为空的极端情况需要考虑。

   2. 数组不存在重复元素时需要通过   q - p > 1 条件来进行优化。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- huatuo0.cn 版权所有 湘ICP备2023017654号-2

违法及侵权请联系:TEL:199 18 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务