持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第10天,点击查看活动详情
870. 优势洗牌
给定两个大小相等的数组 nums1 和 nums2,nums1 相对于 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[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;
}
}