算法D36 | 贪心算法5 | 435. 无重叠区间 763.划分字母区间 56. 合并区间

今天的三道题目,都算是 重叠区间 问题,大家可以好好感受一下。 都属于那种看起来好复杂,但一看贪心解法,惊呼:这么巧妙!
还是属于那种,做过了也就会了,没做过就很难想出来。

不过大家把如下三题做了之后, 重叠区间 基本上差不多了

435. 无重叠区间

代码随想录

和射气球那个题比较像。

Python:

python 复制代码
class Solution:
    def eraseOverlapIntervals(self, intervals: List[List[int]]) -> int:
        if len(intervals)==1: return 0
        intervals.sort()
        ans = 0
        for i in range(1, len(intervals)):
            if intervals[i][0] < intervals[i-1][1]:
                intervals[i][1] = min(intervals[i-1][1], intervals[i][1])
                ans += 1
        return ans

C++:

cpp 复制代码
class Solution {
public:
    static bool cmp(const vector<int>& a, const vector<int>& b) {
        return a[0] < b[0];
    }
    int eraseOverlapIntervals(vector<vector<int>>& intervals) {
        if (intervals.size()==1) return 0;
        sort(intervals.begin(), intervals.end(), cmp);
        int result = 0;
        for (int i=1; i<intervals.size(); i++) {
            if (intervals[i][0] < intervals[i-1][1]) {
                intervals[i][1] = min(intervals[i][1], intervals[i-1][1]);
                result++;
            }
        }
        return result;
    }
};

763.划分字母区间

代码随想录

Python暴力法:

分情况讨论,需要多建一个当前字母集合。

python 复制代码
class Solution:
    def partitionLabels(self, s: str) -> List[int]:
        occ_dict = {}
        for i,e in enumerate(s):
            occ_dict[e] = i
        result = []
        cur_ele_set = set()
        cur_start = -1
        for i,e in enumerate(s):
            if occ_dict[e] > i:
                cur_ele_set.add(e)
            elif e in cur_ele_set:
                cur_ele_set.remove(e)
            if len(cur_ele_set)==0:
                result.append(i-cur_start)
                cur_start = i
        return result

C++贪心:

一是学一下用hash来表示这里的occ_map,会比dictionary更节省空间, 二是卡哥这里用max贪心的思想来更新右节点,用right==i来判断,很巧妙。python版本比较直接。

cpp 复制代码
class Solution {
public:
    vector<int> partitionLabels(string s) {
        int hash[27] = {0};
        for (int i=0; i<s.size(); i++) {
            hash[s[i] - 'a'] = i;
        }
        vector<int> result;
        int left = -1;
        int right = 0;
        for (int i=0; i<s.size(); i++) {
            right = max(right, hash[s[i]-'a']);
            if (i==right) {
                result.push_back(right-left);
                left = i;
            }
        }
        return result;
    }
};

56. 合并区间

本题相对来说就比较难了。

代码随想录

Python:

先按左端点排序,然后按是否overlap分类讨论,看是否更新区间或者结果。

python 复制代码
class Solution:
    def merge(self, intervals: List[List[int]]) -> List[List[int]]:
        n = len(intervals)
        if n==1: return intervals
        intervals.sort()
        result = []
        left, right = intervals[0]
        for i in range(1, n):
            if intervals[i][0] > right:
                result.append([left, right])
                left, right = intervals[i]
            else:
                right = max(right, intervals[i][1])
        result.append([left, right])                
        return result

C++:

cpp 复制代码
class Solution {
public:
    static bool cmp(const vector<int>& a, const vector<int>& b) {
        return a[0] < b[0];
    }
    vector<vector<int>> merge(vector<vector<int>>& intervals) {
        if (intervals.size()==1) return intervals;
        sort(intervals.begin(), intervals.end(), cmp);
        vector<vector<int>> result;
        int left = intervals[0][0];
        int right = intervals[0][1];
        for (int i=1; i<intervals.size(); i++) {
            if (intervals[i][0]>right) {
                result.push_back(vector<int> {left, right});
                left = intervals[i][0];
                right = intervals[i][1];
            } else {
                right = max(right, intervals[i][1]);
            }
        }
        result.push_back(vector<int> {left, right});
        return result;
    }
};
相关推荐
骥龙17 分钟前
1.2、实战准备:AI安全研究环境搭建与工具链
人工智能·python·安全
黄思搏18 分钟前
Python + uiautomator2 手机自动化控制教程
python·智能手机·自动化
@LetsTGBot搜索引擎机器人22 分钟前
Telegram 被封是什么原因?如何解决?(附 @letstgbot 搜索引擎重连技巧)
开发语言·python·搜索引擎·机器人·.net
AndrewHZ22 分钟前
【图像处理基石】图像对比度增强入门:从概念到实战(Python+OpenCV)
图像处理·python·opencv·计算机视觉·cv·对比度增强·算法入门
XXX-X-XXJ23 分钟前
Django 用户认证流程详解:从原理到实现
数据库·后端·python·django·sqlite
宁清明1 小时前
【小宁的学习日记2 C语言】C语言判断
c语言·学习·算法
2401_841495642 小时前
【数据结构】基于Prim算法的最小生成树
java·数据结构·c++·python·算法·最小生成树·prim
追烽少年x3 小时前
Qt中使用C++日志库
c++·qt
木井巳3 小时前
[Java数据结构和算法] HashMap 和 HashSet
java·数据结构·1024程序员节
祈祷苍天赐我java之术4 小时前
解析常见的限流算法
java·数据结构·算法