顺序表算法设计方法

/*假设一个线性表采用顺序表表示,设计一个算法,删除其中所有值等于x的元素,
要求算法的时间复杂度为O(n),空间复杂度为O(1)*/

//从时间复杂度上看只能遍历一次顺序表
//从空间复杂度上看其中设置的临时变量只能是简单变量,不能是表
//所以可以排除的思路有:①每找到一个与x相等的元素都整体移动一次(原因:由于出现嵌套循环,故其时间复杂度至少为O(n^2),空间复杂度为O(1));
//②临时新建一个顺序表存放不等于x的元素(原因:其新建一个顺序表使得空间复杂度为O(n),由于仅需遍历一次顺序表所以其时间复杂度为O(n))


//所以我们就在想能不能找到一个与x元素相等时,就'跳过它',让不等于x的后面元素覆盖其元素位置,依次类推:
//所以就有了以下代码:
void del_equalnode(SqList*& L, ElemType x)
{
    int i = 0, k = 0;//k是用来标记没有断片的位置的,i是记录遍历顺序表位置的
    for (i = 0; i < L->length; i++)
    {
        if ((L->data[i] != x)
        {
            L->data[k] = L->data[i];
                k++;
        }
    }
    L->length=k;
}

//代码分析:由于整个过程仅遍历一次顺序表且仅创建了两个临时简单变量,故满足题目的算法要求


//除了以上的思路,还有一种通过遍历得到有多少个与x相等的元素个数决定元素移动的个数,让不等于x的后面元素覆盖其元素位置
//以下是该思路的代码:
void del_equalnode(SqList*& L, ElemType x)
{
    int i = 0,k = 0;
    while (i<L->length)
    {
        if (L->data[i] == x)
            k++;
        else
            L->data[i - k] = L->data[i];
        i++;
    }
    L->length -= k;
}

//代码分析:全过程仅变量一次顺序表,其元素移动是有距离k的要求,没有从头重新移动,无新建顺序表,故可以满足题目的算法要求


Respect!!!!!!

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值