| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 数据结构与算法 -> 链表-移动小球 -> 正文阅读 |
|
[数据结构与算法]链表-移动小球 |
题面部分题目描述 你有一些小球,从左到右依次编号为1,2,3,4,5,....,n。你可以执行两种指令,其中A X Y表示将编号为X的小球移到编号为Y的小球左边,B X Y表示把小球X移到小球Y的右边,指令保证合法,即X不等于Y。例如当n等于6时,小球的初始顺序为1 2 3 4 5 6,执行A 1 4后的顺序为2 3 1 4 5 6,继续执行B 3 5之后的顺序为:2 1 4 5 3 6 输入 输入第一行包括两个正整数,分别是小球个数n(n<500000)和指令条数m(m<100000),然后是m行,每行一条指令。 输出 输出执行完指令后,从左到右输出最后的序列。 样例输入?
样例输出?
思路与解答解法一?首先考虑朴素的做法,考虑用数组记录每个编号的小球所处的位置,移动小球时就先要在位置表中找到a和b小球所处的位置然后分情况考虑: (在下面的说明中使用pos(x)代表编号为x的小球所处的位置(下标从1开始))
在这个做法中,我们每进行一步操作就要在位置表中找到对应的两个小球的位置(查找的过程可以用哈希表创建小球编号和位置的索引所以复杂度是O(1)的),然后改变对应位置的编号的小球的下标。 这种做法的时间复杂度是O(m*n)的,显然会超时。 解法二下面考虑时间复杂度为O(m+n)的做法: 考虑存储每个小球对应的左边小球的编号和右边小球的编号,从而我们可以想到使用双向链表来实现,为简化代码,采用数组来模拟链表。 链表的前 (pre)指针为 left? ,后 (next)指针为 right,于是乎我们每读入一个操作就可以在O(1)的时间内更改两个对应小球的左右小球和它们自己的左右位置关系,然后输出。
时间复杂度:初始化链表和读取链表和找头指针的时间是O(n),读入操作命令进行移动的时间是O(m),总时间复杂度O(m+n)? 代码实现??
|
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/25 19:16:13- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |