算法学习day30-贪心算法

用最少数量的箭引爆气球

核心思路

  • 这道题贪心的点在于, 让气球尽可能多的有重合的部分, 这样就可以一箭射穿

  • 先根据左边界排序, 再判断 下个气球的左边界和上个气球的右边界是否有重合的部分, 有的话, 就能一箭射穿

    • 注意, 这里要更新重合部分的边界, 重合部分的边界是: 当前气球的左边界, 两个气球的最小的右边界
  • 如果没有重合的部分, 那就从当前气球开始重新寻找重合的边界

    java 复制代码
    public static int findMinArrowShots(int[][] points) {
        Arrays.sort(points, Comparator.comparingInt(a -> a[0]));
        int res = 1;
        int rightBian = points[0][1];
        for (int i = 1; i < points.length; i++) {
            int[] point = points[i];
            int left = point[0];
            int right = point[1];
            if (left > rightBian) {
                res++;
                rightBian = right;
            } else {
                rightBian = Math.min(right, rightBian);
            }
        }
        return res;
    }

无重叠区间

核心思路

  • 和射气球思路类似, 如果重叠就移除, 不重叠, 就用新的右边界继续判断是否重叠

    java 复制代码
    public int eraseOverlapIntervals(int[][] intervals) {
        Arrays.sort(intervals, Comparator.comparingInt(a -> a[0]));
        int preRight = intervals[0][1];
        int count = 0;
        for (int i = 1; i < intervals.length; i++) {
            int[] ints = intervals[i];
            int left = ints[0];
            int right = ints[1];
            if (left < preRight) {
                count++;
                preRight = Math.min(right, preRight);
            } else {
                preRight = right;
            }
        }
        return count;
    }

划分字母区间

核心思路

  • 找到每个字母的最大区间范围, 如果下个字母和上个字母有重叠, 那就取最小left和最大right作为新的区间, 继续判断

    java 复制代码
    public List<Integer> partitionLabels(String s) {
        int left = 0;
        int right = 0;
        int[] fastIndex = new int[26];
        char[] charArray = s.toCharArray();
        for (int i = 0; i < charArray.length; i++) {
            fastIndex[charArray[i] - 'a'] = i;
        }
        List<Integer> res = new ArrayList<>();
        for (int i = 0; i < charArray.length; i++) {
            int index = fastIndex[charArray[i] - 'a'];
            if (i <= right) {
                left = Math.min(i, left);
                right = Math.max(index, right);
            } else {
                res.add(right - left + 1);
                left = i;
                right = index;
            }
        }
        res.add(right - left + 1);
        return res;
    }
相关推荐
zhangrelay1 分钟前
答疑-是否软件源问题都必须更换为国内呢-
linux·笔记·学习·ubuntu·ros2
zhangrelay6 分钟前
《ROS 机器人程序设计》课程教学大纲-2026- kinetic-lyrical
linux·笔记·学习·ubuntu·机器人
具身AGI26 分钟前
物理AI人类学习路线的答案
人工智能·学习
s_w.h1 小时前
【 刷题 】双指针
算法
啥都想学点的研究生1 小时前
一篇文章讲清楚:K-Means聚类算法
算法·kmeans·聚类
白狐_7981 小时前
408 数据结构|KMP做题方法:next、nextval和高频易错点
数据结构·算法
那年窗外下的雪.1 小时前
AIDC 学习日志|第 21 天|EVPN 多归属故障演练与中断窗口定位
网络·git·学习
月华路1 小时前
《模型不玄学》第20章 两种评估视角
人工智能·算法·机器学习
wuyk5551 小时前
从零吃透 MQTT 通信|第 5 章 MQTT 心跳保活机制深度优化,断线检测与智能自动重连
c语言·开发语言·stm32·学习
幼儿园蛋小黄1 小时前
基于 TCP 的嵌入式网络通信学习总结
网络协议·学习·tcp/ip