此篇记录我刷题中觉得比较奇妙,值得记录的题或者解法。
Course Schedule III
一道课程选择的问题,给你一堆课程,告诉你每个课程上课所需时间以及停课日期。让你如何选择尽可能多的课。
我没想出来怎么做,看了下讨论区,用的最大堆的方法。先将课程以end time排个序,然后用贪心的方法,每次选取一门课,先入堆,然后判断是否可行,假如不可行,那么就把已选的耗时最长的去掉,然后继续选,题目简单但是还挺精妙的。
代码如下:
class Solution {
public:
int scheduleCourse(vector<vector<int>>& courses) {
sort(courses.begin(), courses.end(), [](vector<int> a, vector<int> b) {return a[1] < b[1];});
int now = 0, n = courses.size();
priority_queue<int> heap;
for (int i=0; i<n; i++) {
heap.push(courses[i][0]);
now += courses[i][0];
if (now > courses[i][1]) {
now -= heap.top();
heap.pop();
}
}
return heap.size();
}
};
双指针问题
3Sum
3Sum Closest
4Sum
这类求和的题目。主要思想就是双指针,能够减少一些复杂度。还有就是一些简单的优化,排好序后,假如前面几个和就大于target,那么就不用考虑后面的了。这个双指针是一个从前往后,一个从后往前。
还有一类是隔着固定距离从前往后遍历,如下题目:
Remove Nth Node From End of List