一、题目
给定一个数组arr,代表每个人的能力值。在给定一个非负数k,如果两个人的能力差值为k,那么就可以凑在一起比赛,一局比赛两个人,返回最多可以同时有多少场比赛
二、题解
2.1 方法一:贪心
【注意】:第一步需要将给定的数组排序,如果不排序数组将失去单调性
该题目贪心的思路是
L和R 最初都指向数组的头,从左往右进行移动,保证了能力值小的人能先凑到一起比赛,这样就能保证求出最多同时比赛的场数。
public static int MaxPairNum2(int[] arr,int k){
if(k<0||arr==null||arr.length<2){
return 0;
}
Arrays.sort(arr);
int ans=0;
int N=arr.length;
int L=0;
int R=0;
boolean[] usedR=new boolean[N];
while (L<N&&R<N){
if(usedR[L]){ //当L指向用过的人的时候L++
L++;
}else if(L==R){ //当L和R 指向同一个人的时候R++
R++;
}else{
int distance=arr[R]-arr[L];
if(distance==k){
ans++;
usedR[R++]=true;
}else if(distance<k){
R++;
}else{ //如果L和R的差值>k,L++
L++;
}
}
}
return ans;
}
2.2暴力解法
public static int maxPairNum1(int[] arr,int k){
if(k<0){
return -1;
}
return process1(arr,0,k);
}
public static int process1(int[] arr,int index,int k){
int ans=0;
if(index==arr.length){
for (int i = 0; i < arr.length; i+=2) {
if(arr[i]-arr[i-1]==k){
ans++;
}
}
}else {
for(int r=index;r< arr.length;r++){
swap(arr,index,r);
ans=Math.max(ans,process1(arr,index+1,k));
swap(arr,index,r);
}
}
return ans;
}