题意
给定全部由数字组成的数组nums1和nums2,求nums1的一个组合,使得nums1中的每一个数字都尽量比nums2中的字符大。
题目链接
https://leetcode.com/problems/advantage-shuffle/description/
题解
这题是田忌赛马的n维版本。首先会想到给nums1和nums2排序,对每一位进行比较
如果nums1的值能赢,那就这一位就是nums1,如果赢不了,那这一位就是nums1中最小的值,来送人头。
但由于我无法打乱nums2的顺序,可以用大顶堆来记录当前值和下标的关系
class Solution {
public:
vector<int> advantageCount(vector<int>& nums1, vector<int>& nums2) {
sort(nums1.begin(), nums1.end(), greater<>());
priority_queue<pair<int, int>, vector<pair<int,int>>> q;
vector<int> ret;
ret.resize(nums1.size());
int left = 0;
int right = nums1.size()-1;
for(int i = 0; i < nums2.size();i++) {
q.push({nums2[i], i});
}
while(q.size()) {
auto [x,y] = q.top();
q.pop();
if(nums1[left] > x) {
ret[y] = nums1[left];
left++;
} else {
ret[y] = nums1[right];
right--;
}
}
return ret;
}
};
时间复杂度:O(nlogn)O(nlogn)O(nlogn)
空间复杂度:O(n)O(n)O(n)h
Leetcode 870:优势洗牌算法题解
122

被折叠的 条评论
为什么被折叠?



