持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第9天,点击查看活动详情
前言
今天的题目为中等,通过田忌赛马的思维就能够简单的解决这道题
每日一题
今天的题目是 870. 优势洗牌,难度为中等
-
给定两个大小相等的数组 nums1 和 nums2,nums1 相对于 nums2 的优势可以用满足 nums1[i] > nums2[i] 的索引 i 的数目来描述。
-
返回 nums1 的任意排列,使其相对于 nums2 的优势最大化。
示例 1:
输入:nums1 = [2,7,11,15], nums2 = [1,10,4,11]
输出:[2,11,7,15]
示例 2:
输入:nums1 = [12,24,8,32], nums2 = [13,25,32,11]
输出:[24,32,8,12]
提示:
- 1 <= nums1.length <= 105
- nums2.length == nums1.length
- 0 <= nums1[i], nums2[i] <= 109
题解
排序暴力模拟
根据题目的意思,我们需要对第一个数组进行重新排序,使得第一个数组中大于第二个数组的项最多。
相信大家都知道田忌赛马的故事,所以我们在对第二个数组中的每一项进行比较的时候,要尽量选择第一个数组中,恰好比它大一点的那个数,在找不到比它大的数的时候,要用第一个数组里尽可能小的数。
所以我们可以将第一个数组进行排序,循环遍历第二个数组,在循环到第二个数组的某一个数的时候,从小到大循环第一个数组,找到刚好大一点的那个数,要是每个数都没有当前的数大,那说明第二个数组的这个数,大于第一个数组的所有数,那么就拿第一个数组的最小的那个数和它对位。
function advantageCount (nums1, nums2) {
nums1.sort((a, b) => a - b)
let res = []
nums2.forEach(item => {
let a = 0
for (let i = 0; i < nums1.length; i++) {
if (nums1[i] > item) {
res.push(nums1[i])
nums1.splice(i, 1)
a = 1
break
}
}
if (a == 0) {
res.push(nums1[0])
nums1.splice(0, 1)
}
})
return res
};