下面 schedule 函数的时间复杂度为( )。
#include <algorithm>
using namespace std;
struct activity {
int id, start, end;
};
bool compare(activity a, activity b) {
return a.end < b.end;
}
int schedule(int n, activity * p) {
sort(p, p + n, compare);
int cnt = 0, end = 0;
for (int i = 0; i < n; i++) {
if (p[i].start >= end) {
end = p[i].end;
cnt++;
}
}
return cnt;
}分析时间复杂度时关注循环层数和每层迭代次数,递归算法则分析递归树。注意最坏/最好/平均情况的区别。
分析复杂度时注意外层循环和内层循环的关联。例如内外两层都到n的循环不一定是O(n²),要看内层是否每次都在缩小。
【考点】排序(自定义比较器)|时间复杂度分析|线性扫描
1. 🎯 考纲定位
2. 🧠 解题思维
sort(p, p+n, compare),这是 n 个元素按自定义规则排序,复杂度 O(n log n)。for (int i=0;i<n;i++) 是单趟线性扫描,每次只做常数比较与赋值,复杂度 O(n)。3. 🪤 陷阱拆解
4. 🔄 反命题思维