首页 > 编程语言 >【算法训练营day36】LeetCode435. 无重叠区间 LeetCode763. 划分字母区间 LeetCode56. 合并区间

【算法训练营day36】LeetCode435. 无重叠区间 LeetCode763. 划分字母区间 LeetCode56. 合并区间

时间:2023-02-01 22:56:32浏览次数:60  
标签:LeetCode56 vector end day36 int intervals result 区间 return

LeetCode435. 无重叠区间

题目链接:435. 无重叠区间

独上高楼,望尽天涯路

好像有点开窍了!我的思路是,升序排序(左对齐),然后按顺序遍历,遇到重叠时,拿走尾巴更长的区间,从而保证局部最优。

class Solution {
public:
    static bool cmp(vector<int>& a, 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;
        int right = intervals[0][1];
        for (int i = 1; i < intervals.size(); i++) {
            if (intervals[i][0] < right) {
                result++;
                right = min(right, intervals[i][1]);
            }
            else {
                right = intervals[i][1];
            }
        }
        return result;
    }
};

慕然回首,灯火阑珊处

贪心的思路是一样的,甚至感觉我的实现比题解更巧妙一点!!

class Solution {
public:
    // 按照区间右边界排序
    static bool cmp (const vector<int>& a, const vector<int>& b) {
        return a[1] < b[1];
    }
    int eraseOverlapIntervals(vector<vector<int>>& intervals) {
        if (intervals.size() == 0) return 0;
        sort(intervals.begin(), intervals.end(), cmp);
        int count = 1; // 记录非交叉区间的个数
        int end = intervals[0][1]; // 记录区间分割点
        for (int i = 1; i < intervals.size(); i++) {
            if (end <= intervals[i][0]) {
                end = intervals[i][1];
                count++;
            }
        }
        return intervals.size() - count;
    }
};

LeetCode763. 划分字母区间

题目链接:763. 划分字母区间

独上高楼,望尽天涯

遍历s的过程中讨论所有情况,勉强ac。

class Solution {
public:
    vector<int> partitionLabels(string s) {
        vector<int> result;
        bool used[26] = {0};
        int start_index = 0;
        int end_index = 0;
        for (int i = 0; i < s.size(); i++) {
            if (used[s[i] - 'a']) {
                continue;
            }
            used[s[i] - 'a'] = true;
            int j;
            for (j = s.size() - 1; j >= i; j--) {
                if (s[j] == s[i]) {
                        break;
                    }
                }
            if (i <= end_index && j > end_index) {
                end_index = j;
            }
            else if (i > end_index && j > end_index) {
                result.push_back(end_index - start_index + 1);
                start_index = i;
                end_index = j;
            }
        }
        result.push_back(end_index - start_index + 1);
        return result;
    }
};

慕然回首,灯火阑珊

在遍历的过程中相当于是要找每一个字母的边界,如果找到之前遍历过的所有字母的最远边界,说明这个边界就是分割点了。此时前面出现过所有字母,最远也就到这个边界了。

  • 统计每一个字符最后出现的位置。
  • 从头遍历字符,并更新字符的最远出现下标,如果找到字符最远出现位置下标和当前下标相等了,则找到了分割点。
class Solution {
public:
    vector<int> partitionLabels(string s) {
        int hash[26] = {0};
        for (int i = 0; i < s.size(); i++) {
            hash[s[i] - 'a'] = i;
        }
        vector<int> result;
        int begin = 0;
        int end = 0;
        for (int i = 0; i < s.size(); i++) {
            end = max(end, hash[s[i] - 'a']);
            if (end == i) {
                result.push_back(end - begin + 1);
                begin = i + 1;
            }
        }
        return result;
    }
};

LeetCode56. 合并区间

题目链接:56. 合并区间

独上高楼,望尽天涯

排序后,遍历intervals的过程中讨论所有情况。

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) {
        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 && intervals[i][1] > right) {
                right = intervals[i][1];
            }
            else if (intervals[i][0] > right) {
                result.push_back({left, right});
                left = intervals[i][0];
                right = intervals[i][1];
            }
        }
        result.push_back({left, right});
        return result;
    }
};

慕然回首,灯火阑珊

思路本质上是一样的,但是代码还有很多可以优化的地方,学习了!

class Solution {
public:
    vector<vector<int>> merge(vector<vector<int>>& intervals) {
        vector<vector<int>> result;
        if (intervals.size() == 0) return result;
        // 排序的参数使用了lambda表达式
        sort(intervals.begin(), intervals.end(), [](const vector<int>& a, const vector<int>& b){return a[0] < b[0];});

        result.push_back(intervals[0]);
        for (int i = 1; i < intervals.size(); i++) {
            if (result.back()[1] >= intervals[i][0]) { // 合并区间
                result.back()[1] = max(result.back()[1], intervals[i][1]);
            } else {
                result.push_back(intervals[i]);
            }
        }
        return result;
    }
};

标签:LeetCode56,vector,end,day36,int,intervals,result,区间,return
From: https://www.cnblogs.com/BarcelonaTong/p/17084402.html

相关文章

  • [概率论与数理统计]笔记:5.3 置信区间
    5.3置信区间前言点估计无法提供其估计的误差,而区间估计可以。案例:“某人的月薪比2k多,比20k少”,这就是一个区间估计。区间估计的好坏有两个衡量指标:区间长度真实值......
  • P6327 区间加区间sin和 题解
    P6327区间加区间sin和题解第一道Ynoi(捂脸题目描述给出一个长度为\(n\)的整数序列\(a_1,a_2,\ldots,a_n\),进行\(m\)次操作,操作分为两类。操作\(1\):给出\(l,r,v......
  • BM2 链表内指定区间反转
    https://www.nowcoder.com/practice/b58434e200a648c589ca2063f1faf58c?tpId=295&tqId=654&ru=%2Fpractice%2F1291064f4d5d4bdeaefbf0dd47d78541&qru=%2Fta%2Fformat-top10......
  • hdu:Two Rabbits(区间DP)
    ProblemDescriptionLonglongago,therelivedtworabbitsTomandJerryintheforest.Onasunnyafternoon,theyplannedtoplayagamewithsomestones.Th......
  • R语言使用bootstrap和增量法计算广义线性模型(GLM)预测置信区间|附代码数据
    原文链接:http://tecdat.cn/?p=15062最近我们被客户要求撰写关于广义线性模型的研究报告,包括一些图形和统计输出。 考虑简单的泊松回归 。给定的样本,其中,目标是导出......
  • 力扣-56-合并区间
    好吧,上一题排序的思路其实是这一题的…......
  • js判断多个区间是否有交叉重叠
    <scripttype="text/javascript">/**思路:把开始日期、结束日期分别存进两个数组,从开始时间的第二个元素去比较结束时间的第一个元素。*......
  • 力扣-57-插入区间
    采用最直接的思路,if-else去考虑每一种情况并做出操作(比如找到新区间左端点落在哪个位置,几种情况,然后再去考虑右端点的几种情况)是非常细致繁琐的,以至于很容易出错考虑三种......
  • 区间信息的维护与查询
    \(BIT\)大家都会。//可单点修改区间查询的BIT//BIT<N>tree;定义一个大小为N的BIT//modify(x,v)a[x]+=v//query(x)->sum(1,x)的值//query(x,y)->sum(x,......
  • 经典问题 1 —— DAG 上区间限制拓扑序
    问题描述给定一个DAG,求一个拓扑序,使得节点\(i\)的拓扑序\(\in[l_i,r_i]\)。题解首先进行一个预处理:对于所有\(u\),令\(\forall(v,u)\inE,l_u\leftarrow\max(l......