问题描述:
- 给定两个大小相等的数组
nums1
和nums2
,nums1
相对于nums2
的优势可以用满足nums1[i] > nums2[i]
的索引i
的数目来描述。 - 返回
nums1
的任意排列,使其相对于nums2
的优势最大化。
核心思路:
- 该题其实比较简单,第一反应就是贪心策略。
- 首先考虑将
nums1
升序排序,然后遍历nums2
中每一个数字num
,找到nums1
中第一个高于num
的数即可(也就是调用upper_bound
),如果找不到,就找当前数组中的最小数值即可。 - 关键在于每次从
nums1
中取走一个数值,就要将其从nums1
中去除掉,因此如果继续用数组来保存就会很麻烦。 - 看了评论,有人用了
multiset
来保存nums1
中的数值,那么问题就解决了,取走数之后直接erase
即可。
- 首先考虑将
- 前一种思路其实就是固定
nums2
中数值,从nums1
中取合适的数;另一种思路其实是对两个数组排序后固定nums1
,接着从nums2
中确定数字是否合适,具体看参考内容即可。
代码实现:
- 方案一代码实现如下:
class Solution { public: vector<int> advantageCount(vector<int>& nums1, vector<int>& nums2) { multiset<int> ss(nums1.begin(),nums1.end()); vector<int> ans; for(int x:nums2) { auto iter = ss.upper_bound(x); if(iter == ss.end()) { ans.push_back(*ss.begin()); ss.erase(ss.begin()); } else { ans.push_back(*iter); ss.erase(iter); } } return ans; } };