起因:每日一题官解看不明白
今天(2024 年 5 月 4 日)做 Leetcode 每日一题又没有做出来,最后抄了答案。题目是这样的:1235. 规划兼职工作。
思路是先按照 endTime
排序,然后再 dp,然后 dp 中用二分查找求满足“自己的 endTime
小于等于当前元素 startTime
” 的元素数量。但是官方解答的 std::upper_bound
传参实在是看迷糊了。
二分查找:AoS 和 SoA 的比较
一般数组(Array of Structures 或 AoS)排序好之后,直接用 std::lower_bound
/ std::upper_bound
做就好了。但如果数组里面存的不是可以直接用 operator<
或者自定义 comp 比较的值,写 comp 就比较伤脑筋。比如这道题里面为了减少数据拷贝(或者内存使用量),只对下标排序:
注:comp 指的是自定义的比较器。
int jobScheduling(vector<int> &startTime, vector<int> &endTime, vector<int> &profit) {
vector<int> idx(n);
iota(idx.begin(), idx.end(), 0);
sort(idx.begin(), idx.end(), [&](int i, int j) -> bool { return endTime[i] < endTime[j]; });
// ...
}