[每日一题] leetcode 870. 优势洗牌

87 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第10天,点击查看活动详情

870. 优势洗牌

给定两个大小相等的数组 nums1 和 nums2nums1 相对于 nums 的优势可以用满足 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 <= 10^5
nums2.length == nums1.length
0 <= nums1[i], nums2[i] <= 109

思路

不如叫它田忌赛马!

我们可以,发现,这个是一道贪心题

尽可能多的满足我们的优势

首先,我们将两个数组排个序

然后,我们来证明一下邻项交换不会更优

设我们第一个序列为a[0..n]设我们第二个序列为b[0..n]对于当前a序列的第x项,b序列的第y项来说:若是a[x]<=b[y],那么,必然a[x]<=b[y+1]若是a[x]>b[y],那么,我们可以断言a[x]>b[y1]为保证最大的优势,我们交换b[y]b[y1]不会使答案变得更优秀同理,b[y]b[y+1]也是一样 设我们第一个序列为 a[0..n] \\ 设我们第二个序列为 b[0..n] \\ 对于当前a序列的第x项,b序列的第y项来说: \\ 若是 a[x] <= b[y],那么,必然 a[x] <= b[y + 1] \\ 若是 a[x] > b[y],那么,我们可以断言 a[x] > b[y-1] \\ 为保证最大的优势,我们交换 b[y] 和 b[y-1] 不会使答案变得更优秀 \\ 同理,b[y]和b[y+1]也是一样

最后,我们采取一个优先队列来存储第二个数组,同时记录好下标位置

然后,我们将第一个数组进行排序,排序之后,我们依次去匹配优先队列中的最小元素

若是匹配到了一个最小元素,可以证明的是,当前的 a[x] 匹配了 b[y], 那么 a[x+1]也一定匹配b[y]

若要满足最大优势,我们选择 a[x]去匹配 b[y]显然更加优秀

那么,最后,剩下一些 不能够匹配的元素,把这些元素以任意的顺序加入空位即可~

(吐槽 刚开始写rust,写的浑身不舒服

代码

use std::collections::{BinaryHeap};
impl Solution {
    pub fn advantage_count(nums1: Vec<i32>, nums2: Vec<i32>) -> Vec<i32> {
        let n = nums1.len();
        let mut ans: Vec<i32> = Vec::new();
        ans.resize(n, -1);
        let mut b: BinaryHeap<(i32, usize)> = BinaryHeap::new();
        let mut nums1 = nums1;
        nums1.sort();
        for i in 0..n {
            b.push((-nums2[i], i));
        }
        for i in 0..n {
            if let Some(&cur) = b.peek() {
                if -cur.0 < nums1[i] {
                    ans[cur.1] = nums1[i];
                    nums1[i] = -1;
                    b.pop();
                }
            }
        }
        let mut l: usize = 0;
        for i in 0..n {
            if ans[i] != -1 {
                continue;
            }
            while nums1[l] == -1 {
                l += 1;
            }
            ans[i] = nums1[l];
            nums1[l] = -1;
        }
        return ans;
    }
}