用最少数量的箭引爆气球 LeetCode 425
题目链接:[LeetCode 425 - 中等]
思路
Arrays.sort(points,(a,b)->Integer.compare(a[0],b[0]));只能使用Integer的compare方法,原因为[[-2147483646,-2147483645],[2147483646,2147483647]]的示例。
贪心:
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],points[i-1][1]);
}
}
return count;
}
}
无重叠区间 LeetCode 435
题目链接:[LeetCode 435 - 中等]
思路
首先根据左边排序,然后取相交的集合中较小的一个数。
贪心:
class Solution {
public int eraseOverlapIntervals(int[][] intervals) {
int result = 0;
Arrays.sort(intervals,(a,b)->Integer.compare(a[0],b[0]));
int pre = intervals[0][1];
for(int i=1;i<intervals.length;i++){
if(intervals[i][0]<pre){
result++;
pre=Math.min(intervals[i][1],pre);
}else{
pre = intervals[i][1];
}
}
return result;
}
}
划分字母区间 LeetCode 763
题目链接:[LeetCode 763 - 中等]
思路
1.edge数组的长度为26->表示为26个字母 2.判断该字母是否是最后一次出现,如果是,在list中记录。
贪心:
class Solution {
public List<Integer> partitionLabels(String s) {
List<Integer> list = new LinkedList<>();
char[] chars = s.toCharArray();
int[] edge = new int[26];
for(int i=0;i<chars.length;i++){
edge[chars[i]-'a']=i;
}
int idx = 0;
int last = -1;
for(int i=0;i<chars.length;i++){
idx = Math.max(idx,edge[chars[i]-'a']);
if(i==idx){
list.add(i-last);
last=i;
}
}
return list;
}
}
合并区间 LeetCode 56
题目链接:[LeetCode 56 - 中等]
思路
1.数组排序 2.更新判断重叠区间的右侧 3.最后再加入一组结果 4.如何将List<int[]>转化为int[][]
贪心:
class Solution {
public int[][] merge(int[][] intervals) {
Arrays.sort(intervals,(a,b)->Integer.compare(a[0],b[0]));
List<int[]> list = new ArrayList<>();
int left = intervals[0][0];
int right = intervals[0][1];
for(int i=1;i<intervals.length;i++){
if(intervals[i][0]<=right){
right = Math.max(right,intervals[i][1]);
}else{
list.add(new int[]{left,right});
left = intervals[i][0];
right = intervals[i][1];
}
}
list.add(new int[]{left,right});
return list.toArray(new int[list.size()][]);
}
}