代码随想录算法训练营第36天|● 435. 无重叠区间 ● 763.划分字母区间 ● 56. 合并区间

435. 无重叠区间

题目链接

思路:贪心思路依然是让重叠区间尽可能安排在一起,然后统计重叠区间的数量。

class Solution {
public:
    static bool cmp(const vector& a,const vector& b){
        return a[0]>& intervals) {
        if(intervals.size()==1) return 0;
        sort(intervals.begin(),intervals.end(),cmp);
        int count=0;
        for(int i=1;i

错因:开始忘记排序了,注意自定义的cmp函数里传入的参数不是int型,是传入的vector。因为sort函数里面要比较的元素类型是vector型。

763.划分字母区间

题目链接

思路:本题分为两步,

1、统计每一个字符最后出现的位置

2、从头遍历字符,并更新字符的最远出现下标,如果找到字符最远出现位置下标和当前下标相等了,则找到了分割点

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

class Solution {
public:
    vector partitionLabels(string s) {
        int hash[27]={0};
        for(int i=0;i result;
        int left=0,right=0;
        for(int i=0;i

56. 合并区间

题目链接

思路:依然是先进行排序,将重叠区间尽可能安排在一起,然后判断重叠情况,按题目要求,重叠了应该怎么做,不重叠应该怎么做。

需要注意的是。本题没有直接在intervals(原数组)上进行操作,因为我们在合并之后要插入新的数组的同时,还需要删除合并之前的两个数组,那么原数组的大小就发生变化了,后面在for循环遍历的时候就有可能会出现死循环或者其他不可控的问题。

class Solution {
public:
    static bool cmp(const vector& a,const vector& b){
        return a[0]> merge(vector>& intervals) {
        vector> result;
        if(intervals.size()==1) return intervals;
        //首先进行排序,然后才开始遍历
        sort(intervals.begin(),intervals.end(),cmp);
        //因为之后遍历的时候是要和上一个区间进行比较,所以先放进来一个区间,直接对result里的区间进行操作
        result.push_back(intervals[0]);
         for(int i=1;i

你可能感兴趣的:(leetcode,贪心算法,动态规划)