问题描述:
输入:
5
1 2
5 3
4 6
7 5
9 0
输出:
4 6
7 5
9 0
思路:先按照y降序排序,然后循环遍历x坐标,当x为当前遍历坐标的x最大值时,即为所要的坐标,以x为键加入加入到TreeMap中,最后,遍历TreeMap输出坐标,时间复杂度为nlgn+n。
//平面点集的“最大”点集(即该点的右上角没有点,横纵坐标都不大于该点) 时间复杂度nlogn
import java.util.Comparator;
import java.util.Iterator;
import java.util.Map;
import java.util.Scanner;
import java.util.TreeMap;
public class MaxPoint {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int x, y = 0;
// 将点按照y降序,x升序排列.以y为键,降序排列
TreeMap<Integer, Integer> out = new TreeMap<>();
TreeMap<Integer, Integer> pt = new TreeMap<>(new Comparator<Integer>() {
@Override
public int compare(Integer o1, Integer o2) {
return o2 - o1;
}
});
for (int i = 0; i < n; i++) {
x = sc.nextInt();
y = sc.nextInt();
pt.put(y, x);
}
// 将x大于前面所有值的最大值所在的坐标加入map
Iterator<Map.Entry<Integer, Integer>> it = pt.entrySet().iterator();
int max = -1;
while (it.hasNext()) {
Map.Entry<Integer, Integer> entry = it.next();
if (entry.getValue() > max) {
max = entry.getValue();
out.put(entry.getValue(), entry.getKey());
}
}
// 遍历输出
Iterator<Map.Entry<Integer, Integer>> itOut = out.entrySet().iterator();
while (itOut.hasNext()) {
Map.Entry<Integer, Integer> entry = itOut.next();
System.out.println(entry.getKey() + " " + entry.getValue());
}
}
}