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

435. 跟昨天的最后一题差不多,今天静下心来看看也不是很难。需要自己去画个图先想下思路。

class Solution {
    public int eraseOverlapIntervals(int[][] intervals) {
        if (intervals.length == 0) return 0;

        //按照左边界进行排序
        Arrays.sort(intervals, (a, b) -> Integer.compare(a[0], b[0]));

         int count=0;
         int end  = intervals[0][1]; // 初始化第一个区间的右边界

        //从1开始遍历,刚开始才能比较i-1。从第二个区间开始遍历
        for(int i=1; i<intervals.length; i++){
            if(end > intervals[i][0]){
                count++;
                //更新右边界
                end = Math.min(end, intervals[i][1]);
            }else{
                end = intervals[i][1];
            }
        }
        return count;
    }
}

763. 当我看到这个题目直接看不懂的时候就知道应该直接看题解了。看完之后整体还不算难,第一步用数组来记录每个字符出现的最远位置真的是太巧妙了,值得学习!

贪心算法,寻找最远的出现位置! LeetCode:763.划分字母区间_哔哩哔哩_bilibili《代码随想录》算法公开课开讲啦!快来打卡!本期视频的文字讲解版在「代码随想录」刷题网站:programmercarl.comGithub:https://github.com/youngyangyang04/leetcode-master, 视频播放量 18896、弹幕量 311、点赞数 508、投硬币枚数 360、收藏人数 93、转发人数 16, 视频作者 代码随想录, 作者简介 我是Carl,哈工大师兄,先后在腾讯和百度从事一线技术研发的程序员,公众号「代码随想录」,相关视频:一周刷爆LeetCode,算法大神左神(左程云)耗时100天打造算法与数据结构基础到高级全家桶教程,直击BTAJ等一线大厂必问算法面试题真题详解(马士兵),贪心算法理论基础!,带你学透回溯算法(理论篇)| 回溯法精讲!,从此再也不怕动态规划了,动态规划解题方法论大曝光 !| 理论基础 |力扣刷题总结| 动态规划入门,我更完了,你看完了吗?,贪心算法,依然是判断重叠区间 | LeetCode:435.无重叠区间,贪心算法,判断重叠区间问题 | LeetCode:452.用最少数量的箭引爆气球,帮你把KMP算法学个通透!(理论篇),贪心算法,不要两边一起贪,会顾此失彼 | LeetCode:406.根据身高重建队列,带你学透0-1背包问题!| 关于背包问题,你不清楚的地方,这里都讲了!| 动态规划经典问题 | 数据结构与算法icon-default.png?t=N7T8https://www.bilibili.com/video/BV18G4y1K7d5/?spm_id_from=333.788&vd_source=8e2358f9b27440129acde1350d40c3cb

class Solution {
    public List<Integer> partitionLabels(String s) {
        List<Integer> res = new LinkedList<>();

        int[] hash = new int[26];
        //记录每个字母出现的最远的位置!
        for(int i=0; i<s.length(); i++){
            hash[s.charAt(i) - 'a'] = i;
        }

        int left=0;
        int right=0;
        for(int i=0; i<s.length(); i++){
            //分割线
            right = Math.max(right, hash[s.charAt(i) - 'a']);
            if(i == right){
                res.add(right - left + 1);  // 修正长度计算
                left = right + 1; // 更新left为right的下一个位置
            }
        }
        return res;
    }
}

56. 有点难度,需要考虑的有点多,但是和今天的第一题其实也不是差很多。在重叠的时候合并区间而不是简单的计算有几个重叠区间。

贪心算法,合并区间有细节!LeetCode:56.合并区间_哔哩哔哩_bilibili

class Solution {
    public int[][] merge(int[][] intervals) {
        List<int[]> res = new LinkedList<>();
        //按照左边界排序
        Arrays.sort(intervals, (x, y) -> Integer.compare(x[0], y[0]));

        //initial start 是最小左边界
        int start = intervals[0][0];
        int rightmostRightBound = intervals[0][1];

        for (int i = 1; i < intervals.length; i++) {
            //如果左边界大于最大右边界
            if (intervals[i][0] > rightmostRightBound) {
                //加入区间 并且更新start
                // 这里add不用intervals[i][1]而是rightmostRightBound,是因为考虑是否存在更早前的区间已经有一个更远的结束点
                res.add(new int[]{start, rightmostRightBound});
                start = intervals[i][0];
                rightmostRightBound = intervals[i][1];
            } else {
                //更新最大右边界
                // intervals[i]可能与前一个区间重叠,或者完全位于前一个区间内
                rightmostRightBound = Math.max(rightmostRightBound, intervals[i][1]);
            }
        }
        
        // 确保最后一个正在处理的区间被正确加入到结果列表中
        res.add(new int[]{start, rightmostRightBound});
        return res.toArray(new int[res.size()][]);
    }
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值