文章目录
- 题目一
- 思路分析
- 代码实现
- 效果
- 题目二
- 思路分析
- 代码实现
- 效果
题目一
01.设置一个高效算法,将顺序表L的所有元素逆置,要求其空间复杂度为O(1)。
思路分析
- 首先,根据题目要求,空间复杂度度为O(1),则不能通过空间换时间的方式来实现低时间复杂度的算法设计。
- 然后,我们可以考虑使用双指针的算法思想,设置两个指针分别指向顺序表的表头元素和表尾元素,然后借助常数级的辅助空间实现元素交换。当两个指针相遇(或错过)时,推出算法。
- 按照上述的操作步骤,可以通过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的数据元素。
思路分析
- 首先,删除指定元素需要有两个步骤:找到指定元素位置、删除指定元素。
- 然后,查询指定元素无法使用顺序表随机存取的特性,因为事先不知道顺序表中的元素。若是查找到一个元素再删除一个元素,还需要移动n-i个元素前移一个位置,故而难以实现O(n)时间复杂度完成上述操作。
- 因此,我们参考快排算法的思想,将所有划分为左右两个子序列,将待删除元素放置到顺序表的后半段,而非删除元素放置到顺序表的前半段。在查找玩顺序表的所有元素后,统一删除后半段待删除元素。 此时,可以实现删除顺序表中所有指定元素,并且时间时间复杂度为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;
}