优势洗牌
题目
优势洗牌
题目分析
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;} };