跳至主要內容

优势洗牌-田忌赛马

Mr.He小于 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
};