【每周例题】 C++ 力扣 优势洗牌
优势洗牌
题目

题目分析
1.采用双指针方法进行匹配
2.依照题目所说,采用索引,首先需要填充索引,然后对索引进行升序排序。
2.使用双指针进行匹配
- 如果
nums1[idx1[i]](即当前nums1中的元素)大于nums2[idx2[left]](即nums2中的当前最小元素),则将nums1[idx1[i]]赋值给ans[idx2[left]],并将left指针向右移动一位,以考虑nums2中的下一个最小元素。 - 否则,如果
nums1[idx1[i]]不大于nums2[idx2[left]],则将nums1[idx1[i]]赋值给ans[idx2[right]],并将right指针向左移动一位。这表示我们将nums1中的当前元素“匹配”给了nums2中的当前最大元素,因为我们无法找到一个更大的元素来“匹配”nums2中的当前最小元素。
if (nums1[idx1[i]] > nums2[idx2[left]])
{
ans[idx2[left]] = nums1[idx1[i]];
++left;
}
else
{
ans[idx2[right]] = nums1[idx1[i]];
--right;
}
代码
class Solution
{
public:
vector<int> advantageCount(vector<int>& nums1, vector<int>& nums2)
{
int n = nums1.size();
vector<int> idx1(n), idx2(n);
//iota函数用于填充idx1和idx2,将它们初始化为从0到n - 1的连续整数。
iota(idx1.begin(), idx1.end(), 0);
iota(idx2.begin(), idx2.end(), 0);
//升序
sort(idx1.begin(), idx1.end(), [&](int i, int j) { return nums1[i] < nums1[j]; });
sort(idx2.begin(), idx2.end(), [&](int i, int j) { return nums2[i] < nums2[j]; });
vector<int> ans(n);
int left = 0, right = n - 1;
for (int i = 0; i < n; ++i)
{
if (nums1[idx1[i]] > nums2[idx2[left]])
{
ans[idx2[left]] = nums1[idx1[i]];
++left;
}
else
{
ans[idx2[right]] = nums1[idx1[i]];
--right;
}
}
return ans;
}
};

浙公网安备 33010602011771号