算法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;
    }
};
相关推荐
艾莉丝努力练剑2 分钟前
【C语言】学习过程教训与经验杂谈:思想准备、知识回顾(三)
c语言·开发语言·数据结构·学习·算法
Chasing__Dreams8 分钟前
python--杂识--18.1--pandas数据插入sqlite并进行查询
python·sqlite·pandas
ZZZS051611 分钟前
stack栈练习
c++·笔记·学习·算法·动态规划
位东风34 分钟前
【c++学习记录】状态模式,实现一个登陆功能
c++·学习·状态模式
hans汉斯37 分钟前
【人工智能与机器人研究】基于力传感器坐标系预标定的重力补偿算法
人工智能·算法·机器人·信号处理·深度神经网络
彭泽布衣1 小时前
python2.7/lib-dynload/_ssl.so: undefined symbol: sk_pop_free
python·sk_pop_free
喜欢吃豆2 小时前
从零构建MCP服务器:FastMCP实战指南
运维·服务器·人工智能·python·大模型·mcp
一个处女座的测试2 小时前
Python语言+pytest框架+allure报告+log日志+yaml文件+mysql断言实现接口自动化框架
python·mysql·pytest
vortex52 小时前
算法设计与分析:分治、动态规划与贪心算法的异同与选择
算法·贪心算法·动态规划
nananaij2 小时前
【Python基础入门 re模块实现正则表达式操作】
开发语言·python·正则表达式