Keshawn_lu's Blog

Leetcode 870. 优势洗牌

字数统计: 350阅读时长: 1 min
2022/10/08 Share

题目简介:

给定两个大小相等的数组 nums1nums2nums1 相对于 nums优势可以用满足 nums1[i] > nums2[i] 的索引 i 的数目来描述。

返回 nums1 的任意排列,使其相对于 nums2 的优势最大化。

示例 1:

1
2
输入:nums1 = [2,7,11,15], nums2 = [1,10,4,11]
输出:[2,11,7,15]

示例 2:

1
2
输入:nums1 = [12,24,8,32], nums2 = [13,25,32,11]
输出:[24,32,8,12]

提示:

  • 1 <= nums1.length <= 105
  • nums2.length == nums1.length
  • 0 <= nums1[i], nums2[i] <= 10^9

思路:

将两个数组从小到大排序后,依次比较nums1[i]nums2[idx2[left]]的大小,若nums1[i]大,就将nums1[i]放至对应的位置中(贪心,用相对最小的数来大于对方的数)。若比不过,则将nums1[i]放至数组的最后(用最小的数去打对方最大的数,田忌赛马)。

代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
class Solution {
public:
vector<int> advantageCount(vector<int>& nums1, vector<int>& nums2) {

vector<int> idx2(nums2.size());

iota(idx2.begin(), idx2.end(), 0);

sort(idx2.begin(), idx2.end(), [&](int i, int j){

return nums2[i] < nums2[j];
});

sort(nums1.begin(), nums1.end());

vector<int> res(nums1.size());
int left = 0;
int right = nums2.size() - 1;

for(int i = 0; i < nums1.size(); i++){

if(nums1[i] > nums2[idx2[left]]){

res[idx2[left]] = nums1[i];
left++;
}
else{

res[idx2[right]] = nums1[i]; //将其放至最后,和最大的去比
right--;
}
}

return res;
}
};
CATALOG
  1. 1. 题目简介:
  2. 2. 思路:
  3. 3. 代码如下: