算法day26-贪心之重叠区间(4)
目录
- 用最少数量的箭引爆气球
- 无重叠区间
- 划分字母区间
一、用最少数量的箭引爆气球
https://leetcode.cn/problems/minimum-number-of-arrows-to-burst-balloons/description/?envType=problem-list-v2&envId=8At1GmaZ

class Solution { public int findMinArrowShots(int[][] points) { if(points.length == 0) return 0; // Step 1: 按 xend 排序(每个气球的右边界) Arrays.sort(points, (a,b)-> Integer.compare(a[1],b[1])); //按X_end进行升序排序 // Step 2: 初始化第一支箭射在第一个气球的xend位置 int res = 1; int xend = points[0][1]; for(int i=1; i<points.length; i++){ if(points[i][0] > xend){ res++; xend = points[i][1]; } // 否则,当前气球可以被上一支箭射中,什么都不做 } return res; } }
二、无重叠区间
https://leetcode.cn/problems/non-overlapping-intervals/?envType=problem-list-v2&envId=8At1GmaZ

class Solution { public int eraseOverlapIntervals(int[][] intervals) { //去掉最少的区间使得剩下区间没有重叠=>保留最多的不重叠区间 //是上一题的反问题 //先按结束位置排序 Arrays.sort(intervals,(a,b)->(Integer.compare(a[1],b[1]))); int res = 1; int xend = intervals[0][1]; for(int i=1; i<intervals.length; i++){ if(intervals[i][0] >= xend){ res++; xend = intervals[i][1]; } } return intervals.length - res; } }
三、划分字母区间
https://leetcode.cn/problems/partition-labels/?envType=problem-list-v2&envId=8At1GmaZ

class Solution { public List<Integer> partitionLabels(String s) { List<Integer> res = new ArrayList<>(); int[] last = new int[26]; //记录26个字母最后出现的位置 //1.遍历记录每个字符的最后出现的位置 for(int i=0; i<s.length(); i++){ last[s.charAt(i) - 'a'] = i; } //2.从左到右扫描,按最大边界切分 int start = 0, end = 0; for(int i=0; i<s.length(); i++){ end = Math.max(end, last[s.charAt(i)-'a']); //更新最大边界 if(i == end){ //到达最大边界 res.add(end-start+1); start = i+1; } } return res; } }
浙公网安备 33010602011771号