当前位置: 首页 > news >正文

【贪心算法4】

力扣452.用最少数量的剪引爆气球

链接: link

思路

这道题的第一想法就是如果气球重叠得越多那么用箭越少,所以先将气球按照开始坐标从小到大排序,遇到有重叠的气球,在重叠区域右边界最小值之前的区域一定需要一支箭,这道题有两个地方容易出错:
1.出现重叠区域,忘记更新最右边气球的有边界;
2.在重叠区域内射箭,即在下面提供的代码中else里执行res++;
这是我自己容易犯的错

class Solution {
    public int findMinArrowShots(int[][] points) {
        if (points.length == 0)
            return 0;
        Arrays.sort(points, (a, b) -> Integer.compare(a[0], b[0]));
        int res = 1;// 气球数组不为0,至少需要一支箭
        for (int i = 1; i < points.length; i++) {
            // 当前气球开始位>前一个气球的结束位置
            if (points[i][0] > points[i - 1][1]) {
                res++;
            } else {
                // 否则当前气球和前一个气球挨着
                // 更新当前气球的有边界,瑜前一个气球比较
                // 更新是为了避免和后一个气球比较的时候重复射箭
                points[i][1] = Math.min(points[i][1], points[i - 1][1]);
            }
        }
        return res;
    }
}

435.无重叠区间
链接: link

class Solution {
    public int eraseOverlapIntervals(int[][] intervals) {
        if (intervals.length == 1)
            return 0;
        // 按照右边界排序,从前向后遍历
        Arrays.sort(intervals, (a, b) -> Integer.compare(a[1], b[1]));
        int cnt = 1;// 统计重合区域
        for (int i = 1; i < intervals.length; i++) {
            // 当前节点的左边界<前一个节点的右边界,一定有重合
            if (intervals[i][0] < intervals[i - 1][1]) {
                // 更新当前节点右边界
                intervals[i][1] = Math.min(intervals[i][1], intervals[i - 1][1]);
            } else {
                // 当前节点和前一个节点没有重合
                cnt++;
            }
        }
        return intervals.length - cnt;
    }
}

相似题型

763.划分字母区间
链接: link

class Solution {
    public List<Integer> partitionLabels(String s) {
        List<Integer> ls = new ArrayList<>();
        int[] edge = new int[26];
        char[] chars = s.toCharArray();
        for (int i = 0; i < chars.length; i++) {
            edge[chars[i] - 'a'] = i; // 记录每个字母最大边界
        }
        int left = 0, right = 0;
        for (int i = 0; i < chars.length; i++) {
            right = Math.max(right, edge[chars[i] - 'a']);
            if (i == right) {
                ls.add(i - left + 1);
                left = right + 1;
            }
        }
        return ls;
    }
}

56.合并区间
链接: link

思路

这种题本质和【贪心算法4】的452和435一样的套路,这几道题都是判断区间重叠,区别就是判断区间重叠后的逻辑,本题是判断区间重贴后要进行区间合并。所以一样的套路,先排序,让所有的相邻区间尽可能的重叠在一起,按左边界,或者右边界排序都可以,处理逻辑稍有不同。
唯一需要考虑的是什么时候更新区间以及添加到ls中。

class Solution {
    public int[][] merge(int[][] intervals) {
        List<int[]> ls = new ArrayList<>();
        if(intervals.length == 1) return intervals;
        Arrays.sort(intervals,(a,b)->Integer.compare(a[0], b[0])); // 按照左边界排序
        int start = intervals[0][0],end = intervals[0][1];
        for(int i = 1;i<intervals.length;i++){
            // 无重叠
            if(intervals[i][0] > end){
                // 合并
                ls.add(new int[]{start,end});
                // 更新
                start = intervals[i][0];
                end = intervals[i][1];
            }
            else{
                end = Math.max(end,intervals[i][1]);
            }
        }
        ls.add(new int[]{start,end});
        return ls.toArray(new int[ls.size()][]);
    }
}

相关文章:

  • AI 变革药物研发:深势科技的云原生实践之路
  • 【每日学点HarmonyOS Next知识】tab拦截、组件方法做参数、自定义组件链式调用、多次观察者监听、横竖屏切换
  • C++20中的`std::endian`:深入理解大端/小端/本地字节序
  • wps word 正文部分段前段后间距调整无用
  • halcon机器人视觉(四)calibrate_hand_eye_stationary_3d_sensor
  • Pytorch系列教程:可视化Pytorch模型训练过程
  • 【WRF-Urban】报错解析:ZDC + Z0C + 2m is larger than the 1st WRF level
  • react实现一个列表的拖拽排序(react实现拖拽)
  • 如何在DBeaverSQL执行界面显示行号
  • 力扣hot100_二叉树
  • 【JavaWeb】快速入门——HTMLCSS
  • 机器人领域专业名词汇总
  • C++学习——顺序表(六)
  • 【探秘机器人:从当下到未来的科技跃迁】
  • 理解 Retrofit 请求头与 GsonConverterFactory 的自动处理机制
  • 关于ant-design-vue中input元素disabled后无法选中复制内容
  • SNIPAR:快速实现亲缘个体的基因型分离与推断
  • Linly-Talker:开源数字人框架的技术解析与影响
  • C# 通过chrome插件将HTML网页转换为PDF
  • 用TypeScript和library needle来创建视频爬虫程序
  • 明查| 新一代AI诊疗系统可3秒筛查13种癌症?没有证据
  • 商务部新闻发言人就出口管制管控名单答记者问
  • 免签国+1,中乌(兹别克斯坦)互免签证协定6月生效
  • 台行政机构网站删除“汉人”改为“其余人口”,国台办回应
  • 来伊份深夜回应“粽子中吃出疑似创可贴”:拿到实物后会查明原因
  • 阶跃星辰CEO姜大昕:追求智能上限仍是最重要的事,多模态的“GPT-4时刻”尚未到来