• 代码随想录算法训练营Day36 || leetCode 435. 无重叠区间 || 763.划分字母区间 || 56. 合并区间


    435. 无重叠区间 

    和上一道气球题类似。只不过上一道题中两个区间左右边界相等可视为一个区间,这里不可以。

    1. class Solution {
    2. public:
    3. // 按照区间右边界排序
    4. static bool cmp (const vector<int>& a, const vector<int>& b) {
    5. return a[1] < b[1];
    6. }
    7. int eraseOverlapIntervals(vectorint>>& intervals) {
    8. if (intervals.size() == 0) return 0;
    9. sort(intervals.begin(), intervals.end(), cmp);
    10. int count = 1; // 记录非交叉区间的个数
    11. int end = intervals[0][1]; // 记录区间分割点
    12. for (int i = 1; i < intervals.size(); i++) {
    13. if (end <= intervals[i][0]) {
    14. end = intervals[i][1];
    15. count++;
    16. }
    17. }
    18. return intervals.size() - count;
    19. }
    20. };

    763.划分字母区间 

    统计每一个字符的最远位置,然后利用双指针来确定区间

    1. class Solution {
    2. public:
    3. vector<int> partitionLabels(string S) {
    4. int hash[27] = {0}; // i为字符,hash[i]为字符出现的最后位置
    5. for (int i = 0; i < S.size(); i++) { // 统计每一个字符最后出现的位置
    6. hash[S[i] - 'a'] = i;
    7. }
    8. vector<int> result;
    9. int left = 0;
    10. int right = 0;
    11. for (int i = 0; i < S.size(); i++) {
    12. right = max(right, hash[S[i] - 'a']); // 找到字符出现的最远边界
    13. if (i == right) {
    14. result.push_back(right - left + 1);
    15. left = i + 1;
    16. }
    17. }
    18. return result;
    19. }
    20. };

    56. 合并区间 

    排序,更新右边界,满足题意后加入数组

    1. class Solution {
    2. public:
    3. static bool cmp(const vector<int>& a, const vector<int>& b) {
    4. return a[0] < b[0];
    5. }
    6. vectorint>> merge(vectorint>>& intervals) {
    7. vectorint>> result;
    8. if (intervals.size() == 0) return result; // 区间集合为空直接返回
    9. sort(intervals.begin(), intervals.end(), cmp);
    10. // 第一个区间就可以放进结果集里,后面如果重叠,在result上直接合并
    11. result.push_back(intervals[0]);
    12. for (int i = 1; i < intervals.size(); i++) {
    13. if (result.back()[1] >= intervals[i][0]) { // 发现重叠区间
    14. // 合并区间,只更新右边界就好,因为result.back()的左边界一定是最小值,因为我们按照左边界排序的
    15. result.back()[1] = max(result.back()[1], intervals[i][1]);
    16. } else {
    17. result.push_back(intervals[i]); // 区间不重叠
    18. }
    19. }
    20. return result;
    21. }
    22. };

  • 相关阅读:
    k8s-Pod基础
    【Windows】你不能访问此共享文件夹,因为你组织的安全策略阻止未经身份验证的来宾访问,这些策略可帮助保护你的电脑
    CPU飙高问题排查命令
    文件操作 IO
    75-Java的List系列集合、集合的并发修改异常问题
    国家开放大学 平时作业训练题
    基于大语言模型扬长避短架构服务
    java.io.IOException: FIS_AUTH_ERROR in Android Firebase
    无人机红外相机的畸变矫正
    unity操作_光源组件 c#
  • 原文地址:https://blog.csdn.net/qq_44884699/article/details/136464164