给定两个大小相等的数组 A 和 B,A 相对于 B 的优势可以用满足 A[i] > B[i] 的索引 i 的数目来描述。
返回 A 的任意排列,使其相对于 B 的优势最大化。
示例 1:
输入:A = [2,7,11,15], B = [1,10,4,11]
输出:[2,11,7,15]
示例 2:
输入:A = [12,24,8,32], B = [13,25,32,11]
输出:[24,32,8,12]
提示:
1 <= A.length = B.length <= 10000
0 <= A[i] <= 10^9
0 <= B[i] <= 10^9
思路:建立一个二维数组,用于储存B数组每个元素以及对应的下标,然后对A和新建的数组进行排序,接下来建立一个存储结果的数组,开始从小到大依次比较,每次将A数组中能够大于B当前元素的最小元素填充到结果数组中B当前元素对应的下标中,然后将此A元素置空,直到将A中所有元素比较完,然后再次遍历A数组,将没有置空的元素依次填入结果数组中没有存放元素的位置。
代码:
class Solution {
public int[] advantageCount(int[] A, int[] B) {
int n = A.length;
int[][] BB = new int[n][2];
int[] ans = new int[n];
for (int i = 0;i < n;i++)
{
BB[i][0] = i;
BB[i][1] = B[i];
ans[i] = -1;
}
Arrays.sort(A);
Arrays.sort(BB, Comparator.comparingInt(x -> x[1]));
int j = 0;
for (int i = 0;i < n;i++)
{
if (A[i] > BB[j][1])
{
ans[BB[j][0]] = A[i];
j++;
A[i] = -1;
}
}
j = 0;
for (int i = 0;i < n;i++)
{
if (A[i] != -1)
{
while (j < n){
if (ans[j] == -1)
{
ans[j] = A[i];
break;
}
j++;
}
}
}
return ans;
}
}