1.优势洗牌
题目:
给定两个大小相等的数组 A 和 B,A 相对于 B 的优势可以用满足 A[i] > B[i] 的索引 i 的数目来描述。
返回 A 的任意排列,使其相对于 B 的优势最大化。
思路:贪心排列A的数字。对于B中的数字,A对应的数字应该是大于该数字的最小值。
对A和B进行排序,当A的第一个元素大于B中的第一个元素时,A弹出第一个元素,B移动到下一个元素去比;否则B不移动。
小于的数字顺序不影响结果。
时间复杂度O(nlogn),空间复杂度O(n)
/**
* @param {number[]} A
* @param {number[]} B
* @return {number[]}
*/
var advantageCount = function(A, B) {
const dp = B.map((item, index) => [item, index]).sort((a, b) => a[0] - b[0]);
A.sort((a, b) => a - b);
let left = [];
const right = [];
let i = 0;
while (A.length) {
if (A[0] > dp[i][0]) {
left.push(A.shift());
i++;
} else {
right.push(A.shift());
}
}
left = left.concat(right);
dp.forEach((item, index) => {
item[0] = left[index];
});
re