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;
};