问题描述
给一个很多数(含重复元素)的集合,如何快速的对集合进行汇总,找出每个元素对应的个数?
思路
存放集合的数据结构,两种,一种使用 红黑树,一种使用 散列表。
- 红黑树:插入时间为 o(nlogn),查找时间为 O(nlogn)。
 - 散列表:理论插入时间为 O(1),查找时间为 O(1)。实际上有可能出现 O(N^2)。另外,使用散列表的方式存放数据,需要使用大量的存储空间。
 
首先对集合进行排序,然后通过两个标识进行元素的计数。
从排完序的集合的首部元素开始,设置两个标识 L、R 在相同元素的边界处。开始时,L = R = 0,遍历排序后的集合元素,R++。当出现两个标识的元素不同时,令 L = R,同时统计改元素的个数为 R - L。
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
  | #include <iostream>
#include <array>
#include <algorithm>
#include "DeleteRepeatElem.h"
void DelRepeatElems() {
    std::array<int, 15> elemArr{1, 2, 3, 4, 5, 6, 7, 342, 432, 43, 2, 34, 5, 6, 2};
    std::sort(elemArr.begin(), elemArr.end());
    int L = 0, R = 0;
    for (; R < elemArr.size(); ++R) {
        if (elemArr[L] != elemArr[R]) {
            std::cout << elemArr[L] << " number is " << R - L << std::endl;
            L = R;
        }
    }
    std::cout << elemArr[L] << " number is " << R - L << std::endl;
}
  | 
关键思想是,先排序,再找重复的元素。时间复杂度方面,使用内置的排序算法,复杂度为 O(nlogn),找出重复次数的话,时间复杂度为 O(n)。所以,整体的时间复杂度为 O(nlogn)。
Leetcode
关于这部分的leetcode题目有一些。
Author
Alfons
LastMod
2018-12-02
License
Creative Commons BY-NC-ND 3.0