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

文章分析了两个LeetCode问题,一个是关于计算无重叠区间的数量(435),另一个是合并并处理重叠区间(56)。通过实例代码展示了如何使用贪心算法解决这些问题,包括对数组的排序和区间边界处理技巧。
摘要由CSDN通过智能技术生成

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
    评论
代码随想录算法训练营是一个优质的学习和讨论平台,提供了丰富的算法训练内容和讨论交流机会。在训练营中,学员们可以通过观看视频讲解来学习算法知识,并根据讲解内容进行刷题练习。此外,训练营还提供了刷题建议,例如先看视频、了解自己所使用的编程语言、使用日志等方法来提高刷题效果和语言掌握程度。 训练营中的讨论内容非常丰富,涵盖了各种算法知识点和解题方法。例如,在第14训练营中,讲解了二叉树的理论基础、递归遍历、迭代遍历和统一遍历的内容。此外,在讨论中还分享了相关的博客文章和配图,帮助学员更好地理解和掌握二叉树的遍历方法。 训练营还提供了每日的讨论知识点,例如在第15的讨论中,介绍了层序遍历的方法和使用队列来模拟一层一层遍历的效果。在第16的讨论中,重点讨论了如何进行调试(debug)的方法,认为掌握调试技巧可以帮助学员更好地解决问题和写出正确的算法代码。 总之,代码随想录算法训练营是一个提供优质学习和讨论环境的平台,可以帮助学员系统地学习算法知识,并提供了丰富的讨论内容和刷题建议来提高算法编程能力。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [代码随想录算法训练营每日精华](https://blog.csdn.net/weixin_38556197/article/details/128462133)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值