优势洗牌
题目
题目分析
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; } };
标签:C++,力扣,ans,idx2,idx1,例题,nums1,nums2,left From: https://www.cnblogs.com/hcrzhi/p/18231544