有一类题,有人说是属于贪心,有人说是属于排序,题目看似复杂,但是通过对二维数组进行排序,就可以直接KO,反正不纠结于分类,话不多说,开始看题。
435.无重叠区间
给定一个区间的集合,找到需要移除区间的最小数量,使剩余区间互不重叠。
注意:
可以认为区间的终点总是大于它的起点。
区间 [1,2] 和 [2,3] 的边界相互“接触”,但没有相互重叠。
排序逻辑:安排下尽可能多的区间,就是要使区间右端点尽可能小,按右端点从小到大的顺序排序,然后从第一个开始找不重叠的区间个数
public static int eraseOverlapIntervals(int[][] intervals) {
if(intervals.length <= 1)
return 0;
Arrays.sort(intervals, new Comparator<int[]>(){
public int compare(int []a, int[]b){
return a[1] - b[1];
}
});
int num = 1;
int pre = 0, next = 1;
while(next < intervals.length){
if(intervals[pre][1] <= intervals[next][0]){
pre = next;
next++;
num++;
}
else{
next++;
}
}
return intervals.length - num;
}
406.根据身高重建队列难度中等411假设有打乱顺序的一群人站成一个队列。 每个人由一个整数对(h, k)表示,其中h是这个人的身高,k是排在这个人前面且身高大于或等于h的人数。 编写一个算法来重建这个队列。
输入:
[[7,0], [4,4], [7,1], [5,0], [6,1], [5,2]]
输出:
[[5,0], [7,0], [5,2], [6,1], [4,4], [7,1]]
排序逻辑:首先可以确定k是按照从小到大的顺序来排,然后由于后面还要对人添加到队列中,要先添加高的人,所以身高要从大到小排序,并且身高为第一排序标准。
public int[][] reconstructQueue(int[][] people) {
Arrays.sort(people, new Comparator<int[]>(){
public int compare(int[]a, int[]b){
if(a[0] == b[0]){
return a[1] - b[1];
}
else return b[0] - a[0];
}
});
List<int[]>list = new LinkedList<>();
for(int i = 0; i < people.length; i++){
list.add(people[i][1], people[i]);
}
return list.toArray(new int[people.length][2]);
}
本文介绍通过排序算法解决两个典型问题的方法:一是如何找到需要移除的最少区间数量,使剩余区间不重叠;二是如何根据身高和队伍前的高人数量重建队伍。文章详细解释了排序逻辑及其在实际问题中的应用。
3104

被折叠的 条评论
为什么被折叠?



