代码随想录算法训练营第 三十五天 |435. 无重叠区间、763.划分字母区间( 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()==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(intervals[i][0]>=end){
                count++;
                end=intervals[i][1];
            }else end=min(end, intervals[i][1]);
        }
        return intervals.size()-count;
    }
};

解题说明

该题目的解法有点神奇,如图

求最少删除多少个区间,使区间无重叠,就是同届重叠个数,然后 总数 - 重叠区间 ,这样就能得到结果了。

  •  其实该题目和上一个代码随想录上的题目是差不多的,但是就是场景有些差异,但是我就是因为这个场景,所以,也就没写出来。

划分字母区间

题目链接

解题代码

class Solution {
public:
    vector<int> partitionLabels(string s) {
        vector<int> result;
        int hash[26] = {0};
        for (int i = 0; i < s.length(); i++)
            hash[s[i] - 'a'] = i;
        int left = 0, right = 0;
        for (int i = 0; i < s.length(); i++) {
            right = max(right, hash[s[i] - 'a']);
            if (right == i) {
                // right = hash[s[i] - 'a'];
                result.push_back(right - left + 1);
                left = i + 1;
            }
        }
        return result;
    }
};

说明

for (int i = 0; i < s.length(); i++)
            hash[s[i] - 'a'] = i;

这个for循环是统计最后出现的位置,直接用i给hash数组赋值就行,不用求max。

对于right不管是什么条件都是要更新的,换句话说就是要时时刻刻更新,所以就直接跟新了。

而且right是要和i比较,而不是和hash[s[i] - 'a']比较。

  • 8
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值