题目描述:
给定两个长度相等的数组 nums1
和 nums2
,nums1
相对于 nums2
的优势 可以用满足 nums1[i] > nums2[i]
的索引 i
的数目来描述。
返回 nums1 的任意 排列,使其相对于 nums2
的优势最大化。
示例一:
cpp
输入:nums1 = [2,7,11,15], nums2 = [1,10,4,11]
输出:[2,11,7,15]
示例二:
cpp
输入:nums1 = [12,24,8,32], nums2 = [13,25,32,11]
输出:[24,32,8,12]
问题解决:
本题主要是要将nums1对于nums2的优势最大化,其实就是将nums1打乱重组,使对应位置上的值
比nums2的值大的数目变的最多,所以我盟首先要做的工作是将两个数组排序,排序之后在通过比
比大小的方式俩对nums1进行重新排序,但是在比较的排序之前必须记录nums2的初识顺序,应为
要用nums2的初识顺序来决定nums1的最终顺序,我们可以用一个下标数组来记录nums2对应的下
标顺序,对应的具体代码如下:
cpp
class Solution
{
public:
vector<int> advantageCount(vector<int>& nums1, vector<int>& nums2)
{
//1.排序
int n = nums1.size();
sort(nums1.begin(),nums1.end());
vector<int> index2(n);
for(int i = 0;i < n;i++)
{
index2[i] = i;
}
sort(index2.begin(),index2.end(),[&](int i,int j)
{
return nums2[i] < nums2[j];
});
//2.田忌赛马
vector<int> ret(n);
int left = 0,right = n - 1;
for(auto x: nums1)
{
if(x > nums2[index2[left]])
{
ret[index2[left++]] = x;
}
else
{
ret[index2[right--]] = x;
}
}
return ret;
}
};
对应以示例二进行演示代码:
由上图可知,在比较的时候其实nums2的位置没有发生真是改变,而是通过下标对应进行了对
nums2的排序,而最终在对nums1排序的时候使用的是田忌赛马的方法,如果nums1的最小比不
过nums2的最小,直接将nums1的最小放在最后,取对抗最大的那个数,反之,如果nums1对应的
位置数较大,直接用来对抗nums2对应位置的数,这就是这道题的基本原理,