提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
- 前言
- 一、力扣452. 用最少数量的箭引爆气球
- 二、力扣435. 无重叠区间
- 三、力扣763. 划分字母区间
- 四、力扣56. 合并区间
前言
本周的主题就是用贪心算法来解决区间问题,经过本周的学习,大家应该对区间的各种合并分割有一定程度的了解了。 其实很多区间的合并操作看起来都是常识,其实贪心算法有时候就是常识,但也别小看了贪心算法。
一、力扣452. 用最少数量的箭引爆气球
class Solution {public int findMinArrowShots(int[][] points) {int count = 1;Arrays.sort(points,(a,b)->{return Integer.compare(a[0],b[0]);});int left = points[0][0], right = points[0][1];for(int i = 1; i < points.length; i ++){if(points[i][0] <= right){left = points[i][0];right = Math.min(right,points[i][1]);}else{count ++;left = points[i][0];right = points[i][1];}}return count;}
}
二、力扣435. 无重叠区间
class Solution {public int eraseOverlapIntervals(int[][] intervals) {int count = 1, sum = 0;Arrays.sort(intervals,(a,b)->Integer.compare(a[0],b[0]));int left = intervals[0][0], right = intervals[0][1];for(int i = 1; i < intervals.length; i ++){if(intervals[i][0] < right){sum ++;left = intervals[i][0];right = Math.min(intervals[i][1],right);}else{count ++;left = intervals[i][0];right = intervals[i][1];}}return sum;}
}
三、力扣763. 划分字母区间
class Solution {public List<Integer> partitionLabels(String s) {List<Integer> res = new ArrayList<>();Map<Character,Integer> map = new HashMap<>();int len = 0, index = 0;for(int i = 0; i < s.length(); i++){map.put(s.charAt(i),i);}index = map.get(s.charAt(0));for(int i = 0; i < s.length(); i ++){if(i > index){res.add(len);len = 1;index = map.get(s.charAt(i));}else{len ++;if(map.get(s.charAt(i)) > index){index = map.get(s.charAt(i));}}}res.add(len);return res;}
}
四、力扣56. 合并区间
class Solution {public int[][] merge(int[][] intervals) {List<int[]> res = new ArrayList<>();Arrays.sort(intervals,(a,b)->Integer.compare(a[0],b[0]));int a1 = intervals[0][0], b1 = intervals[0][1];for(int i = 1; i < intervals.length; i ++){if(intervals[i][0] <= b1){a1 = Math.min(a1,intervals[i][0]);b1 = Math.max(b1,intervals[i][1]);}else{res.add(new int[]{a1,b1});a1 = intervals[i][0];b1 = intervals[i][1];}}res.add(new int[]{a1,b1});return res.stream().toArray(int[][]::new);}
}