问题描述
在唐门,外门弟子唐三发现了一种强大的暗器技巧,名为暴雨梨花针,它能在一条直线上摧毁所有目标。唐三在一本古籍中学习到了这门技巧,为了练习,他设置了若干个靶子在二维平面上。每个靶子是一条垂直于X轴的线段,由三个参数 x_{left},x_{right},y 描述,其中 y 是固定的高度,x_{left} 和 x_{right} 表示线段在X轴上的起止位置。
唐三的目标是使用尽可能少的暴雨梨花针来击中所有靶子。由于暴雨梨花针的珍贵,每次射击必须经济有效。每次射击暴雨梨花针都将从某个 x 值发射,能垂直上升到 y = 100。
请你帮助唐三计算最少需要多少次射击,才能保证击中所有靶子。结果需对给定的 P 取余。
测试样例
样例1:
输入:k = 4, p = 100, target = [[10, 26, 3], [4, 8, 29], [1, 5, 8], [9, 9, 9]]
输出:3
样例2:
输入:k = 3, p = 100, target = [[10, 26, 3], [4, 8, 29], [1, 5, 8]]
输出:2
样例3:
输入:k = 5, p = 100, target = [[5, 15, 5], [1, 2, 3], [20, 25, 2], [6, 18, 2], [30, 40, 1]]
输出:4
样例4:
输入:k = 2, p = 100, target = [[0, 10, 5], [15, 20, 3]]
输出:2
Java代码
import java.util.Arrays;
public class Main {
public static int solution(int k, int p, int[][] target) {
// Please write your code here
// 贪心算法
Arrays.sort(target, (o1, o2) -> {
if (o1[0] > o2[0]) {
return 1;
} else if (o1[0] < o2[0]) {
return -1;
} else {
return o1[1] - o2[1];
}
});
int l = target[0][0], r = target[0][1], result = 1;
for (int i = 1; i < k; i++) {
if (target[i][0] <= r) {
l = Math.max(l, target[i][0]);
r = Math.min(r, target[i][1]);
} else {
result++;
l = target[i][0];
r = target[i][1];
}
}
return result % p;
}
public static void main(String[] args) {
// You can add more test cases here
int[][] testTarget1 = {
{ 10, 26, 3 },
{ 4, 8, 29 },
{ 1, 5, 8 },
{ 9, 9, 9 }
};
int[][] testTarget2 = {
{ 10, 26, 3 },
{ 4, 8, 29 },
{ 1, 5, 8 }
};
int[][] testTarget3 = {
{ 13, 20, 2 },
{ 15, 39, 3 },
{ 34, 89, 6 },
{ 2, 10, 1 },
{ 0, 87, 2 },
{ 23, 49, 3 },
{ 2, 45, 9 },
{ 9, 98, 0 },
{ 3, 12, 9 },
{ 35, 45, 21 },
{ 51, 67, 23 },
{ 37, 42, 54 },
{ 55, 76, 7 },
{ 2, 13, 6 },
{ 29, 31, 9 },
{ 10, 32, 1 }
};
System.out.println(solution(4, 100, testTarget1) == 3);
System.out.println(solution(3, 100, testTarget2) == 2);
System.out.println(solution(16, 100, testTarget3) == 5);
}
}