优势洗牌-田忌赛马
小于 1 分钟
优势洗牌-田忌赛马
给定两个大小相等的数组 A 和 B,A 相对于 B 的优势可以用满足 A[i] > B[i] 的索引 i 的数目来描述。
返回 A 的任意排列,使其相对于 B 的优势最大化。
举例
输入:A = [12,24,8,32], B = [13,25,32,11]
输出:[24,32,8,12]
实现思路
- 对A进行sort得到[8,12,24,32]
- 对B进行sort,但是构建indexB数组存储原先下标[3,0,1,2]
- 顺序对比,如果能比过就读取indexB中的下标,将nums1的值写入,如果比不过直接对上最后一个下标
代码实现
/**
* @param {number[]} nums1
* @param {number[]} nums2
* @return {number[]}
*/
var advantageCount = function(nums1, nums2) {
nums1.sort((val1, val2) => val1 - val2)
let res = []
const indexB = new Array(nums2.length).fill(0).map((item, index) => index)
// 对第二个数组排序,但是只放下标
indexB.sort((index1, index2) => nums2[index1] > nums2[index2] ? 1 : -1)
let i = 0, j = 0, k = nums1.length - 1;
while(i < nums1.length){ // 打得过的
if(nums1[i] > nums2[indexB[j]]){
res[indexB[j]] = nums1[i]
j++
}else{ // 打不过的,直接对最大的,找到最大的下标放入
res[indexB[k]] = nums1[i]
k--
}
i++
}
return res
};