问题:给定一个数组arr,代表每个人的能力值。再给定一个非负数k,如果两个人能力差证号为k,那么可以凑在一起比赛,一局比赛只能有两个人。返回最多可以同时有多少场比赛
解法:贪心+双指针。
先进行排序,双指针L与R,判断对应人是否能够一起比赛。如果能,则记录并且L++、R++;如果差大于k,那么说明L不够大,则L++;如果差小于k,那么说明R不够大,则R++。
/**
* 给定一个数组arr,代表每个人的能力值。
* 再给定一个非负数k,如果两个人能力差证号为k,那么可以凑在一起比赛
* 一局比赛只能有两个人
* 返回最多可以同时有多少场比赛
*/
public class Question9 {
public static void main(String[] args) {
}
/**
* 贪心+双指针
* 贪心:先排序,然后让最左边的先匹配
*
* @param arr
* @return
*/
public int maxRaceNum(int[] arr, int k) {
if (arr == null || arr.length <= 1) return 0;
//排序
Arrays.sort(arr);
int L = 0;
int R = 0;
int res = 0;
boolean[] used = new boolean[arr.length];
while (R < arr.length) {
//如果被使用过,那就跳过
if (used[L]) L++;
//R不能比L小
else if (L >= R) {
R++;
} else {
//如果相等
if (arr[R] - arr[L] == k) {
//标记已经使用
used[L] = true;
used[R] = true;
//同时往下跳
R++;
L++;
res++;
} else if (arr[R] - arr[L] > k) {
//大于k,则说明arr[L]不够大=>L++
L++;
} else if (arr[R] - arr[L] < k) {
//小于k,则说明arr[R]不够大==>R++
R++;
}
}
}
return res;
}
}