Leetcode 435. Non-overlapping Intervals python+CPP

Leetcode 435. Non-overlapping Intervals

  • 题目
  • 解析:
  • python代码
  • C++代码

题目

Leetcode 435. Non-overlapping Intervals python+CPP_第1张图片

解析:

使用贪心策略,核心思想为:选择的区间的结尾应该尽可能的小,结尾越小意味着留给其他区间的空间更大。所以策略为,优先保留结尾小且不相交的区间。具体步骤为:

  • 将区间按照结尾进行从小到大排序
  • 以排序后的第一个区间作为基区间,与后一个区间比较,若相交则舍弃后一个空间,当前基区间不变
  • 若不相交,则将基区间往后移动一个位置

python代码

class Solution:
    def eraseOverlapIntervals(self, intervals: List[List[int]]) -> int:
        if not intervals:
            return 0
        intervals.sort(key = lambda x:x[1])
    
        total = 0
        prev = intervals[0][1]
        for i in range(1,len(intervals)):
            if intervals[i][0]<prev:
                total+=1
            else:
                prev = intervals[i][1]
        return total
            

时间复杂度:O(NlogN),来自于排序
空间复杂度:O(1)

C++代码

class Solution {
public:
    int eraseOverlapIntervals(vector<vector<int>>& intervals) {
        if (intervals.empty()) {
            return 0;
        }
        sort(intervals.begin(),intervals.end(),[](vector<int> a, vector<int> b) { 
            return a[1] < b[1]; 
        });
        int total = 0;
        int prev = intervals[0][1];
        for (int i=1;i<intervals.size();++i){
            if (intervals[i][0]<prev){
                ++total;
            }else{
                prev = intervals[i][1];
            }
        }
        return total;
    }
};

参考链接

你可能感兴趣的:(Leetcode,贪心(greedy))