算法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;
    }
};
相关推荐
奋斗的小花生34 分钟前
c++ 多态性
开发语言·c++
魔道不误砍柴功37 分钟前
Java 中如何巧妙应用 Function 让方法复用性更强
java·开发语言·python
pianmian138 分钟前
python数据结构基础(7)
数据结构·算法
闲晨40 分钟前
C++ 继承:代码传承的魔法棒,开启奇幻编程之旅
java·c语言·开发语言·c++·经验分享
_.Switch1 小时前
高级Python自动化运维:容器安全与网络策略的深度解析
运维·网络·python·安全·自动化·devops
UestcXiye2 小时前
《TCP/IP网络编程》学习笔记 | Chapter 3:地址族与数据序列
c++·计算机网络·ip·tcp
测开小菜鸟2 小时前
使用python向钉钉群聊发送消息
java·python·钉钉
好奇龙猫3 小时前
【学习AI-相关路程-mnist手写数字分类-win-硬件:windows-自我学习AI-实验步骤-全连接神经网络(BPnetwork)-操作流程(3) 】
人工智能·算法
霁月风3 小时前
设计模式——适配器模式
c++·适配器模式
sp_fyf_20243 小时前
计算机前沿技术-人工智能算法-大语言模型-最新研究进展-2024-11-01
人工智能·深度学习·神经网络·算法·机器学习·语言模型·数据挖掘