leetcode刷题记录-870. 优势洗牌

96 阅读1分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 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
};

image.png