【算法集训之线性表篇】Day 02

题目一

01.设置一个高效算法,将顺序表L的所有元素逆置,要求其空间复杂度为O(1)。

思路分析

  1. 首先,根据题目要求,空间复杂度度为O(1),则不能通过空间换时间的方式来实现低时间复杂度的算法设计。
  2. 然后,我们可以考虑使用双指针的算法思想,设置两个指针分别指向顺序表的表头元素和表尾元素,然后借助常数级的辅助空间实现元素交换。当两个指针相遇(或错过)时,推出算法。
  3. 按照上述的操作步骤,可以通过n/2次遍历元素,实现元素逆置。

代码实现

int LinearList::Question_02()
{
    int i = 0,j = arr.length-1;//设置两个哨兵分别指向顺序表arr的表头和表尾元素
    int temp; //辅助交换变量
    while(i < j)//结束循环条件
    {
        temp = 0;//初始化
        temp = arr.data[i];//交换元素
        arr.data[i++] = arr.data[j];
        arr.data[j--] = temp;
    }
    return 0;
}

效果

在这里插入图片描述

题目二

02.对长度为n的顺序表L,编写一个时间复杂度为O(n),空间复杂度为O(1)的算法。该算法删除线性表中所有值为x的数据元素。

思路分析

  1. 首先,删除指定元素需要有两个步骤:找到指定元素位置、删除指定元素。
  2. 然后,查询指定元素无法使用顺序表随机存取的特性,因为事先不知道顺序表中的元素。若是查找到一个元素再删除一个元素,还需要移动n-i个元素前移一个位置,故而难以实现O(n)时间复杂度完成上述操作。
  3. 因此,我们参考快排算法的思想,将所有划分为左右两个子序列,将待删除元素放置到顺序表的后半段,而非删除元素放置到顺序表的前半段。在查找玩顺序表的所有元素后,统一删除后半段待删除元素。 此时,可以实现删除顺序表中所有指定元素,并且时间时间复杂度为O(n),空间复杂度为O(1).

代码实现

int LinearList::Question_03(int x)
{
    int del = 0;//记录删除元素个数
    int i = 0,j = arr.length-1;//设置两个指针分别指向顺序表arr的表头和表尾
    int temp = 0;//辅助交换变量
    while(i < j)//将所有需删除的元素全部交换到顺序表后部,最后统一删除
    {
        if(arr.data[i] != x)
            i++;
        if(arr.data[j] == x)
        {
            del++;
            j--;
        }
        if(arr.data[i] == x && arr.data[j] != x)
        {
            del++;
            temp = arr.data[i];
            arr.data[i++] = arr.data[j];
            arr.data[j--] = temp;
        }
    }
    cout<<"del:"<<del<<endl;
    arr.length -= del;
    return 0;
}

效果

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

葛狂的博客

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值