代码随想录算法训练营第三十六天 _ 贪心算法_435.无重叠区间、763.划分字母区间、56.合并区间。

学习目标:

60天训练营打卡计划!

学习内容:

435.无重叠区间

  • 与452有异曲同工之妙!
  • 掌握Integer自带的比较方法:Integer.compare(a,b); --- 可以避免int比较时的溢出。
java 复制代码
class Solution {
    public int eraseOverlapIntervals(int[][] intervals) {
        int res = 0;
        Arrays.sort(intervals,(a, b) -> Integer.compare(a[0], b[0]));

        for(int i = 1; i < intervals.length; i++){
            if(intervals[i][0] < intervals[i-1][1]){
                res++;
                intervals[i][1] = Math.min(intervals[i-1][1], intervals[i][1]);
            }
        }
        return res;
    }
}

763.划分字母区间

  • 心得:carl哥的各种小技巧用的出神入化,太牛辣!
  • 第一步给数组中的元素附最远的位置值的思路就不是很好想,或者说没接触过的根本想不到,太巧妙了!
  • 第二步中使用双指针来限定每个组的范围也是非常的妙!虽然想着不是很好理解,但确实行之有效。
java 复制代码
class Solution {
    public List<Integer> partitionLabels(String s) {
        int[] hash = new int[26];
        // 给数组中的元素附最远位置值
        for(int i = 0; i < s.length(); i++){
            hash[s.charAt(i) - 'a'] = i;
        }

        List<Integer> res = new ArrayList<>();
        int start = 0;
        int end = 0;
        for(int i = 0; i < s.length(); i++){
            // 限定数组的结束位置
            end = Math.max(end, hash[s.charAt(i) - 'a']);
            if(i == end){
                res.add(i-start+1);
                start = i+1;
                if(start >= s.length())  break;
            }
        } 
        return res;
    }
}

56.合并区间

  • 和435与452思路基本相似,可以轻松拿下!
java 复制代码
class Solution {
    public int[][] merge(int[][] intervals) {
        Arrays.sort(intervals, (a, b) -> Integer.compare(a[0], b[0]));
        // 要学会这个骚操作,可以定义为List<int[]>,然后使用toArray方法就可以变为int[][]
        List<int[]> res = new ArrayList<>();
        for(int i = 1; i < intervals.length; i++){
            if(intervals[i][0] > intervals[i-1][1])
                res.add(intervals[i-1]);
            else{
                intervals[i][1] = Math.max(intervals[i-1][1], intervals[i][1]);
                intervals[i][0] = Math.min(intervals[i-1][0], intervals[i][0]);
                intervals[i-1][0] = -1;
                intervals[i-1][1] = -1;
            }
        }
        res.add(intervals[intervals.length - 1]);
        
        return res.toArray(new int[res.size()][]);
    }
}

学习时间:

  • 上午两小时,下午一小时,整理文档半小时。
相关推荐
循着风1 小时前
二叉树的多种遍历方式
数据结构·算法
.格子衫.6 小时前
022数据结构之树状数组——算法备赛
数据结构·算法·1024程序员节
黑科技Python6 小时前
生活中的“小智慧”——认识算法
学习·算法·生活
sali-tec7 小时前
C# 基于halcon的视觉工作流-章52-生成标定板
开发语言·图像处理·人工智能·算法·计算机视觉
IT古董7 小时前
【第五章:计算机视觉-项目实战之推荐/广告系统】2.粗排算法-(4)粗排算法模型多目标算法(Multi Task Learning)及目标融合
人工智能·算法·1024程序员节
熬了夜的程序员7 小时前
【LeetCode】89. 格雷编码
算法·leetcode·链表·职场和发展·矩阵
對玛祷至昏8 小时前
数据结构理论知识
数据结构·算法·排序算法
oliveira-time8 小时前
二分搜索(Binary Search)
算法
王哈哈^_^9 小时前
【数据集】【YOLO】【目标检测】口罩数据集,口罩佩戴识别数据集 1971 张,YOLO佩戴口罩检测算法实战训练教程。
人工智能·算法·yolo·目标检测·计算机视觉·ai·视觉检测
dragoooon349 小时前
[优选算法专题四.前缀和——NO.31~32 连续数组、矩阵区域和]
数据结构·算法·leetcode·1024程序员节