【每周例题】 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;
        }
};

  

posted @ 2024-06-04 21:38  山远尽成云  阅读(40)  评论(0)    收藏  举报