在做一道LeetCode时需要用到sort()排序,题目是这样的:
当时想了一个比较简单的方法,即先将输入的vector按照第一个元素进行进行排序, 示例中的数组排好序为[ [1, 2], [1, 3], [2,3], [3, 4]]。排好序过后, 对于相邻的两个区间[a, b]和[c, d],如果这两个区间重叠,则判断b和d哪一个值大一点,去掉值较大的那个区间。其中需要用到sort()排序,在使用sort时遇到两个问题:
- 一是如何按照向量的第一个元素排序
- 二是reference to non-static member function must be called报错
对于第一个问题,解决方法是使用sort(array.begin(),array.end(),comparison); 其中comparison是一个谓词,参考了sort按vector元素排序这篇博客。
对于第二个问题:出错代码
sort(intervals.begin(), intervals.end(), comparison);
bool comparison(vector<int> a, vector<int> b) {
return a[0] < b[0];
}
参考reference to non-static member function must be called,错误原因是compare函数形参实参不匹配,解决方法是声明/定义时加上static关键字,因为静态成员函数没有this指针。
static bool comparison(vector<int> a, vector<int> b) {
return a[0] < b[0];
}
最后贴上LeetCode代码记录一下
#include <iostream>
class Solution {
public:
int eraseOverlapIntervals(vector<vector<int>>& intervals) {
if (intervals.size() == 0 || intervals.size() == 0) return 0;
sort(intervals.begin(), intervals.end(), comparison);
int result = 0;
int flag = 1;
int i = 0;
while (i + flag < intervals.size()) {
if (intervals[i+flag][0] < intervals[i][1] ) { // 判断两个相邻的区间是否重叠
result++;// 重叠,必须去掉一个区间
if (intervals[i][1] <= intervals[i+flag][1]) {
flag++; // 区间i继续和i+flag后面的一个即i+flag+1区间相比
}
else {
i = i + flag;
flag = 1;
}
} else { // 没有重叠
i = i + flag;
flag = 1;
}
}
return result;
}
static bool comparison(vector<int> a, vector<int> b) {
return a[0] < b[0];
}
};
代码写得很垃圾,哈哈