1、贪心算法思想
采用贪心策略,保证每次操作都是局部最优的从而使最后得到的结果是全局最优的。
2、LeetCode435
题目描述:(区间问题)
给定一个区间的集合,找到需要移除区间的最小数量,使剩余区间互不重叠。
解答思路:
在选择保留区间时,区间的结尾十分重要。选择区间结尾越小,余留给其他区间的空间就越大,就越能保留更多的区间。因此,我们采取的贪心策略为,优先保留结尾小且不相交的区间。
1、按照区间尾部,从小到大进行排序
2、遍历排序后的数组,取一个变量记录从左往右遍历的最优结果的当前尾部,如果首部小于当前尾部的区间,则有了重叠进行删除,如果没有,则将其的尾部更新为当前尾部。
C++实现代码
class Solution {
public:
int eraseOverlapIntervals(vector<vector<int>>& intervals) {
if(intervals.empty()){
return 0;
}
int n = intervals.size();
//[](vector<int> u, vector<int> v
//sort(intervals.begin(), intervals.end(), [](vector<int> u, vector<int> v)
//注意此处const与&的使用
sort(intervals.begin(), intervals.end(), [](const auto& u, const auto& v) {
return u[1] < v[1]; //比较尾部; 如果是比较首部的话采用 u[0] > v[0]
});
int total = 0, prev = intervals[0][1];
for(int i = 1; i < n; i++){
if(intervals[i][0] < prev){
total++;
}
else{
prev = intervals[i][1];
}
}
return total;
}
};
注:
1、问题:在使用sort排序时,一开始没有用&(引用),代码提交测试后的运行时间为 92ms+,替换成vector<int>&
后运行时间变为12ms,速度大大提升。
2、分析:采用&而省去了创建变量复制的时间。最终代码修改为const auto&
。其中const的使用是为了防止程序对变量的修改。具体理解如下:
C++小课堂
参考