算法时空第4讲 元素去重

元素去重

Posted by Twany on June 27, 2019

元素去重

题目要求:

输入:1,1,2,3,3,5,7,7,8,12,12,13
输出:1,2,3,5,7,8,12,13

方法一 直观查找

即放入数组,逐个对比

方法二 抽象数据类型查找

set红黑树

散列表(暂未接触)

方法三 L、R双边界

由上图可见,我们设置两个“哨兵点”,即arr[left],arr[right],只存储两个元素

每当arr[left]!=arr[right]时,使left = right,之后再进行比较。

代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
public class Main
{
    //元素去重,以1,1,2,3,3,5,7,7,8,12,12,13为例
    public static void main(String[] args)
    {
        int[] arr = {1,1,2,3,3,5,7,7,8,12,12,13};
        int left = 0;
        int right = 0;

        while(right < arr.length){
            if(arr[right] != arr[left]){
                //这样不能输出最后一个元素
                System.out.println(arr[left]);

                //这样则不能输出第一个元素
                //System.out.println(arr[left]);
                left = right;
            }
            right++;
        }

        //输出最后一个元素
        if(arr.length > 0){
            System.out.println(arr[right-1]);
        }

    }
}

此处有一个需要注意的地方:

  • 是输出arr[left]还是arr[right]呢? 看代码我们可以知道,right++System.out.println(arr[left]);left = right;之后。

    所以,当右哨兵到达最后一位时,arr[right]不会输出,所以我们在最后:

    1
    2
    3
    4
    
      //输出最后一个元素
      if(arr.length > 0){
          System.out.println(arr[right-1]);
      }