时间 / 空间复杂度小科普
时间限制:C/C++/Rust/Pascal 1秒,其他语言2秒
空间限制:C/C++/Rust/Pascal 256 M,其他语言512 M
64bit IO Format: %lld

题目描述

致参赛选手:时间 / 空间复杂度小科普(轻松理解不踩坑~)

各位小伙伴:
相信大家都想在这次校赛中发挥出真实水平,而要让代码顺利跑过所有测试用例、避免不必要的 “超时”“超内存” 问题,搞懂「时间复杂度」和「空间复杂度」这两个小概念就很关键啦!不用觉得复杂,咱们用最通俗的话讲清楚,帮大家轻松避坑~

一、先搞懂:这俩 “复杂度” 到底是啥?

其实它们就是用来判断你的代码 “跑得多快”“占多少内存” 的核心指标,和题目给的输入数据规模(比如数组长度 n)直接相关:
  • 时间复杂度:简单说就是代码 “要做多少遍操作”—— 输入数据越多,操作次数会不会暴增?
  • 空间复杂度:就是代码 “要占多少内存”—— 输入数据变大时,会不会需要额外开很多存储空间?
这俩指标不是为了限制大家,而是帮大家提前预判代码能不能通过判题(毕竟判题机有 1 秒时间、256MB 内存的限制呀~)。

二、时间复杂度:别让代码 “跑太慢”

1. 通俗理解:不同复杂度,操作次数差太多!

假设题目输入的数组长度是 n(比如 n=10000),咱们用几个常见情况举例:
  • O (1):不管 n 是 10 还是 10000,都只做 1 次操作(比如取数组第一个元素、两数相加),快到飞起;
  • O (n):操作次数和 n 成正比(比如遍历数组 1 次),n=10000 就做 10000 次,完全没问题;
  • O (n log n):操作次数是 n 乘以一个不大的数(比如快速排序、归并排序),n=100000 时大概 14 万次,依然很快;
  • O (n²):操作次数是 n 的平方(比如双重循环遍历数组),n=100000 时要做 1 亿次 —— 这就麻烦啦!判题机 1 秒大概只能跑 1 亿~10 亿次基础操作,这种代码大概率会 “超时”。

2. 快速判断自己代码的复杂度:

看最内层的循环被执行多少次就行!比如:
  • 单层循环(没有嵌套)→ O (n);
  • 双重循环(套了一层)→ O (n²);
  • 二分查找、快排这类算法→ O (log n) 或 O (n log n)。

三、空间复杂度:别让代码 “占太多内存”

1. 通俗理解:别随便开 “超大数组”

还是以 n 为输入规模:
  • O (1):只开几个变量(比如 int a、b),和 n 没关系,内存占用超小;
  • O (n):开一个长度为 n 的数组、哈希表(比如存所有输入元素),内存占用适中;
  • O (n²):开一个 n×n 的二维数组(比如 n=10000 时,就是 10000×10000 的数组)—— 这时候内存会直接超上限(256MB 根本不够用),代码会被判 “超内存”。

2. 小提醒:

平时写代码时,能用地数组解决的,就别开二维数组;递归的时候也要注意深度,太深了也会占用过多内存哦~

输入描述:

本题无输入

输出描述:

输出“AC“即可过题啦!(只输出引号内的内容)