408-数据结构-顺序表删除相同元素


408-数据结构-顺序表删除相同元素

王道书习题2.2.3 应用题05

题目:从有序顺序表中删除所有其值重复的元素,使表中所有元素的值均不同。

算法步骤:

  1. 初始化检查: 如果数组为空,则直接返回。
  2. 索引初始化: index 用于记录存放不同元素的位置,初始化为0。
  3. 遍历数组: 从数组的第二个元素开始,逐个检查当前元素是否与前一个不同。如果不同,则将index加1,并将当前元素赋值到index位置。
  4. 调整数组大小: 使用resize方法将数组大小调整为index + 1,从而删除多余的重复元素。
  5. 输出结果: 最后,遍历并输出处理后的数组。

这个算法的时间复杂度为O(n),其中n是数组的大小。由于是对原数组进行操作,空间复杂度为O(1)。

代码:

void delSame(vector<int>& arr){
    if (arr.empty()){
        return;
    }
    int i,j;
    for (i = 0,j = 1; j < arr.size(); j++) {
        if (arr[i]!=arr[j]){
            i++;
            arr[i] = arr[j];
        }
    }
    arr.resize(i+1);//当你希望删除容器末尾的元素时,可以使用 resize 来缩小容器的大小。
}

拓展:将本题中的有序表改为无序表,你能想到时间复杂度位O(n)的方法吗?

可以用散列表来实现

在C++中,可以使用哈希表(例如 std::unordered_set)来跟踪已看到的元素

void delSameUnSorted(vector<int>& arr){
    std::unordered_set<int> seen;
    size_t index = 0;

    for (size_t i = 0; i < arr.size(); ++i) {
        if (seen.find(arr[i]) == seen.end()) {
            seen.insert(arr[i]);
            arr[index++] = arr[i];
        }
    }

    arr.resize(index);  // 调整数组大小,删除多余的元素
}
  1. 初始化哈希表std::unordered_set<int> seen 用于跟踪已遇到的元素。
  2. 遍历数组:对于数组中的每个元素,检查它是否已在 seen 中。
  3. 插入新元素:如果元素不在 seen 中,则将其插入 seen 并将其存放在 arr 的当前索引位置,然后增加索引。
  4. 调整数组大小:使用 resize 方法将数组大小调整为不重复元素的数量,删除多余的元素。
  5. 输出结果:最后,遍历并输出处理后的数组。

时间复杂度

  • 时间复杂度:由于哈希表的查找和插入操作平均为 O(1),所以整个算法的时间复杂度为 O(n),其中 n 是数组的大小。
  • 空间复杂度:使用了一个额外的哈希表来存储已遇到的元素,空间复杂度为 O(n)。

Author: qwq小小舒
Reprint policy: All articles in this blog are used except for special statements CC BY 4.0 reprint policy. If reproduced, please indicate source qwq小小舒 !
  TOC