数据结构与算法
参考姥姥:
https://github.com/callmePicacho/Data-Structres/blob/master/README.md
[SCU练习平台题解]课堂练习
练习
PTA
2024/09/05:
NO1,最大子列和问题
在线算法,秒辣!
▶
补:分治法
1 |
|
这题非常经典,分治法当然不是最好的。
“在线算法”实际上是贪心的方法,另一种办法是动态规划
▶
动态规划
1 |
|
但是时间复杂度是O(n*m)肯定会超时,考虑使用单调队列进行优化:
<div class="fold"> <div class="fold-title fold-info collapsed" data-toggle="collapse" href="#collapse-0ad24a9b" role="button" aria-expanded="false" aria-controls="collapse-0ad24a9b"> <div class="fold-arrow">▶</div>动态规划+前缀和+单调队列 </div> <div class="fold-collapse collapse" id="collapse-0ad24a9b"> <div class="fold-content"> 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include<bits/stdc++.h>
using namespace std;
deque<int> dq;
int s[100005];
int main()
{
int n,m;scanf("%d%d",&n,&m);
for(int i = 1;i <= n;++ i)scanf("%lld",&s[i]);
for(int i = 1;i <= n;++ i)s[i] = s[i] + s[i-1];
int ans = -1e8;
dq.push_back(0);
for(int i = 1;i <= n;++ i)
{
while(!dq.empty()&&dq.front() < i - m)dq.pop_front();
if(dq.empty())ans = max(ans,s[i]);
else ans = max(ans,s[i] - s[dq.front()]);
while(!dq.empty() && s[dq.back()] >= s[i])dq.pop_back();
dq.push_back(i);
}
return 0;
}
<p><strong>由此可见,将数据结构与算法结合,威力无穷</strong></p> </div> </div></div>
NO2,多项式的加法和乘法
▶
解答
1 |
|
4 数组×40044 字节/数组=160176 字节
这大约是 156.5 KB。
这样虽然过了,但是没考虑过空间浪费。
1 |
|
这段中尝试使用了动态数组实现顺序表的办法,完成了多项式加法
- 优势:相比上一份静态数组,处理数据时拿多少用多少。比如同样一组输入,空间占用从165kB降至不到100B。
- 缺点:虽然实现,但是代码中有几个问题:
- 1.在线算法,算一条输出一条,不灵活,这也解释了为什么乘法部分没有继续写。更好的做法是再开一个数组存答案。
- 2.输出部分未封装,题目部分有格式要求,较复杂的输出适合单独封装一个函数做输出。
- 3.空间连续,这是开数组和开链表的重要区别:数组空间必须物理上连续,而实际上计算机内存物理上并不连续,你以为的连续实际上是操作系统给出的抽象层,造成了空间连续的假象(逻辑上连续),这就会在要求比较苛刻的情况中浪费空间。
Tips:看懂一份代码不难,重要的是如何独立写出来。一个好办法是阅读注释,注释和编写过程中的调试遗迹是好东西,编写边调试即可化难为简。
可惜的是,大多数题解将调试遗迹删去。
最优解法:链表
1 |
|
0908
NO3,树的同构
▶
同构。
1 |
|
感觉难度明显上升了~,已经听开小白专场了。。。
数据结构与算法
https://43.242.201.154/2024/09/05/Algorithms & Datastructures/