leetcode 870 优势洗牌 JavaScript

这篇博客介绍了如何解决LeetCode的第870题——优势洗牌,使用JavaScript编程。作者首先解释了问题背后的策略,即通过类似于田忌赛马的方法,确保在每次比较中,如果可能,使用较小的A值替换B中的较大值。接着,详细阐述了代码实现过程,包括对数组排序、创建下标数组并排序,以及如何在遍历过程中确定元素的插入位置。通过这种方法,能够保证A数组的优势在洗牌后仍然得以体现。
摘要由CSDN通过智能技术生成

leetcode 870 优势洗牌 JavaScript
在这里插入图片描述
思路:
田忌赛马,意思就是,A拿最小的如果能打得过B最小的,ok同意;如果打不过,我当前A最小的这个要把B最大的抵掉,从而保证A若赚则赚,亏的时候换掉别人最猛的那只。
代码思路大致相同,首先给A和B排序,之后给定i用于遍历完整个A,j和k分别指向B排序后的头和尾
这里有个注意的点,因为后面需要得到对应的下标位置去放数字,所以B在排序前先给定下标,给完之后再对B排序
比如1 10 4 11 对应下标0 1 2 3
排序完之后我要的下标顺序是0 2 1 3
实际上代码实现只对A排序 B本身不排序,B排序的是下标,也就是我代码下面这个tnums2存的是:根据B大小排序后得到的下标[0,2,1,3];然后j k分别指向这个数组的0和3,这样nums2[tnums2[j]]的j遍历就能按大小顺序遍历nums2了,这样做可以保证数据插入到最终数组ans对应下标的位置,也就是ans其实是和nums2顺序一致的,实际目的是用A的数据覆盖B的数据。
之后按照比对思路去进行即可,交换的时候根据刚刚0213这个下标来确定放入的位置。
代码如下:

/**
 * @param {number[]} nums1
 * @param {number[]} nums2
 * @return {number[]}
 */
var advantageCount = function(nums1, nums2) {
    nums1.sort((a,b)=>a-b);
    let tnums2 = nums2.map((val,index)=>index).sort((a,b)=>{if(nums2[a]>nums2[b]) return 1;else return -1;});
    let ans = [];
    let i = 0;//tnums1
    let j = 0;//tnums2
    let k= nums1.length-1;
    while(i<nums1.length){
        if(nums1[i]>nums2[tnums2[j]]){
            ans[tnums2[j++]] = nums1[i];
        }
        else {
            ans[tnums2[k--]] = nums1[i]
        }
        i++;
    }
    return ans;
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值