算法笔记|Day26贪心算法IV

算法笔记|Day26贪心算法IV

  • [☆☆☆☆☆leetcode 452. 用最少数量的箭引爆气球](#☆☆☆☆☆leetcode 452. 用最少数量的箭引爆气球)
  • [☆☆☆☆☆leetcode 435. 无重叠区间](#☆☆☆☆☆leetcode 435. 无重叠区间)
  • [☆☆☆☆☆leetcode 763.划分字母区间](#☆☆☆☆☆leetcode 763.划分字母区间)

☆☆☆☆☆leetcode 452. 用最少数量的箭引爆气球

题目链接:leetcode 452. 用最少数量的箭引爆气球

题目分析

首先对points各个范围按左端点升序排列,依次比较每一个范围左端点与前一个范围右端点。若该范围左端点大于前一个范围右端点,说明没有重叠,需要设计次数count加一;若该范围左端点小于前一个范围右端点,说明有重叠,仅需更新右端点为该范围右端点与前一范围右端点的最小值。

代码

java 复制代码
class Solution {
    public int findMinArrowShots(int[][] points) {
        Arrays.sort(points,(a,b)->Integer.compare(a[0],b[0]));
        int count=1;
        for(int i=1;i<points.length;i++){
            if(points[i][0]>points[i-1][1]){
                count++;
            }else{
                points[i][1]=Math.min(points[i-1][1],points[i][1]);
            }
        }
        return count;
    }
}

提示:
Arrays.sort(points, (a, b) -> { return a[0] - b[0]; });
使用了简单的减法来比较两个点的x坐标。虽然这在大多数情况下可以工作,但它有一个潜在的问题:如果a[0]和b[0]的差值非常大,那么返回的结果可能会是一个大的整数,这可能会导致整数溢出(Integer Overflow)。
Arrays.sort(points, (a, b) -> Integer.compare(a[0], b[0]));
使用了Integer.compare方法。这个方法接受两个整数作为参数,并返回一个整数,表示第一个参数与第二个参数的比较结果。如果第一个参数小于第二个参数,则返回负数;如果它们相等,则返回0;如果第一个参数大于第二个参数,则返回正数。使用Integer.compare方法的好处是它避免了整数溢出的问题,在处理大数时更安全,并且由于它是专门为比较整数而设计的,所以代码的可读性也更好。

☆☆☆☆☆leetcode 435. 无重叠区间

题目链接:leetcode 435. 无重叠区间

题目分析

首先对intervals各个区间按左端点升序排列,依次比较每一个区间左端点与前一个区间右端点。若该区间左端点大于前一个范围右端点,说明没有重叠,无需操作;若该区间左端点小于前一个区间右端点,说明有重叠,计数count加一,同时更新右端点为该区间右端点与前一区间右端点的最小值。

代码

java 复制代码
class Solution {
    public int eraseOverlapIntervals(int[][] intervals) {
        Arrays.sort(intervals,(a,b)->Integer.compare(a[0],b[0]));
        int count=0;
        for(int i=1;i<intervals.length;i++){
            if(intervals[i][0]<intervals[i-1][1]){
                count++;
                intervals[i][1]=Math.min(intervals[i-1][1],intervals[i][1]);
            }
        }
        return count;
    }
}

☆☆☆☆☆leetcode 763.划分字母区间

题目链接:leetcode 763.划分字母区间

题目分析

首先采用哈希数组记录每个字母在该字符串中最后出现的位置,即遍历后序号覆盖。初始left和right赋值为0,依次遍历字符串的每个元素,若遍历到的元素最后出现位置大于当前right值,则更新right值;若遍历到right,则说明得到了一个符合提议的区间,记录该区间长度right-left+1并加到res数组中,同时更新left值为right+1,直至遍历结束。

代码

java 复制代码
class Solution {
    public List<Integer> partitionLabels(String s) {
        List<Integer> res=new ArrayList<>();
        int last[]=new int[26];
        int left=0,right=0;
        for(int i=0;i<s.length();i++)
            last[s.charAt(i)-'a']=i;
        for(int i=0;i<s.length();i++){
            right=Math.max(right,last[s.charAt(i)-'a']);
            if(i==right){
                res.add(right-left+1);
                left=right+1;
            }
        }
        return res;
    }
}
相关推荐
再睡一夏就好1 分钟前
Linux常见工具如yum、vim、gcc、gdb的基本使用,以及编译过程和动静态链接的区别
linux·服务器·c语言·c++·笔记
俺的图图呢?27 分钟前
Django笔记——CSRF
笔记·django·csrf
BB_CC_DD27 分钟前
四. 以Annoy算法建树的方式聚类清洗图像数据集,一次建树,无限次聚类搜索,提升聚类搜索效率。(附完整代码)
深度学习·算法·聚类
我的golang之路果然有问题37 分钟前
快速了解redis,个人笔记
数据库·经验分享·redis·笔记·学习·缓存·内存
无心水1 小时前
【Java面试笔记:基础】8.对比Vector、ArrayList、LinkedList有何区别?
java·笔记·面试·vector·arraylist·linkedlist
卡皮巴拉爱吃小蛋糕1 小时前
MySQL的MVCC【学习笔记】
数据库·笔记·mysql
清流君1 小时前
【MySQL】数据库 Navicat 可视化工具与 MySQL 命令行基本操作
数据库·人工智能·笔记·mysql·ue5·数字孪生
梁下轻语的秋缘2 小时前
每日c/c++题 备战蓝桥杯 ([洛谷 P1226] 快速幂求模题解)
c++·算法·蓝桥杯
CODE_RabbitV2 小时前
【深度强化学习 DRL 快速实践】逆向强化学习算法 (IRL)
算法
BOB-wangbaohai2 小时前
Flowable7.x学习笔记(十四)查看部署流程Bpmn2.0-xml
xml·笔记·学习