顺序有序表中删除多余元素

总时间限制: 1000ms 内存限制: 65535kB

描述

编写算法,在一个非递减有序的顺序表中删除所有值相等的多余的元素。要求时间复杂度为O(n),空间复杂度为O(1)。

输入

两行,第一行为数据元素的个数n,第二行为n个元素,n<=1000000

输出

删除多余元素后的数据序列

样例输入

10
-1 -1 1 2 2 3 3 3 4 5

样例输出

-1 1 2 3 4 5


ac代码

/*
@File     :   sqlist_extraElement_delete.cpp
@Time     :   2020/03/19
@Contact  :   levarz@163.com
@Desc     :   顺序有序表中删除多余元素
*/
#include <iostream>
#include <stdlib.h>

using namespace std;
#define LEN 1000010
//顺序表
typedef struct 
{
   int date[LEN]; //数据域
   int len;       //顺序表长度
}sqlist;
/**
 * @brief Create a sqlist object
 * 
 * @param list 指向需要创建的顺序表指针
 * @param len  需要创建的顺序表长度
 */
void create_sqlist(sqlist *&list, int len);
/**
 * @brief 删除非递减有序顺序表中多余元素
 * 
 * @param lsit 指向需要删除元素的顺序表指针
 */
void delete_extral_elements(sqlist *&lsit);
/**
 * @brief display list
 * 
 * @param list 指向需要显示的顺序表指针
 */
void display(sqlist *&list);

int main(int argc, char const *argv[])
{
    sqlist *list;
    int n;
    cin >>n;
    create_sqlist(list,n);
    delete_extral_elements(list);
    display(list);
    system("pause");
    return 0;
}
void create_sqlist(sqlist *&list, int len)
{
    list = (sqlist*)malloc(sizeof(sqlist));
    for (int i = 0; i < len; i++) {
        cin >>list->date[i];
    }
    list->len = len;
}
void delete_extral_elements(sqlist *&lsit)
{
    int j = 0;
    for (int i = 1; i < lsit->len; i++) {
       if (lsit->date[j]!=lsit->date[i]) {
           lsit->date[++j] = lsit->date[i];     //自身储存
           lsit->date[j]   = lsit->date[i];     //没有多余开辟空间
       }
    }
    lsit->len = j+1;
}
void display(sqlist *&list)
{
    for (int i = 0; i < list->len; i++) {
        cout <<list->date[i] <<" ";
    } 
}
原文地址:https://www.cnblogs.com/levarz/p/12779048.html