【870. 优势洗牌】

news/2024/11/9 4:43:03/

来源:力扣(LeetCode)

描述:

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

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

示例 1:

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

示例 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] <= 109

方法:贪心算法

思路与算法

我们首先分别将数组 nums1 和 nums2 进行排序,随后只需要不断考虑这两个数组的首个元素:

  • 如果 nums1 的首个元素大于 nums2 的首个元素,那么就将它们在答案中对应起来,同时从数组中移除这两个元素,并增加一点「优势」;

  • 如果 nums1 的首个元素小于等于nums2 的首个元素,那么移除 nums1 的首个元素。

当 nums1 中没有元素时,遍历结束。

这样做的正确性在于:

  • 对于第一种情况,由于 nums1 是有序的,那么 nums1 的任意元素大于 nums2 的首个元素:

    • 如果我们不与 nums2 的首个元素配对,由于 nums2 是有序的,之后的元素会更大,这样并不划算;
    • 如果我们与 nums2 的首个元素配对,我们使用 nums1 的首个元素,可以使得剩余的元素尽可能大,之后可以获得更多「优势」。
  • 对于第二种情况,由于 nums2 是有序的,那么 nums1 的首个元素小于等于 nums2 中的任意元素,因此nums1 的首个元素无法增加任何「优势」,可以直接移除。

在本题中,由于 nums1 中的每一个元素都要与 nums2 中的元素配对,而我们是按照顺序考虑 nums2 中的元素的。因此在遍历结束后,nums2 中剩余的元素实际上是原先 nums2 的一个后缀。因此当 nums1 的首个元素无法配对时,我们给它配对一个 nums2 的尾元素即可,并将该尾元素移除。

在实际的代码编写中,我们无需真正地「移除」元素。对于 nums1,我们使用一个循环依次遍历其中的每个元素;对于 nums2,我们可以使用双指针 left 和 right。如果 nums1 的首个元素可以增加「优势」,就配对 left 对应的元素并向右移动一个位置;如果无法配对,就配对 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.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;}
};

执行用时:176 ms, 在所有 C++ 提交中击败了28.28%的用户
内存消耗:58.3 MB, 在所有 C++ 提交中击败了83.02%的用户
复杂度分析
时间复杂度: O(nlogn),其中 n 是数组 nums1 和 nums2 的长度,即为排序需要的时间。
空间复杂度: O(n),即为排序时存储下标需要的空间。
author:LeetCode-Solution


http://www.ppmy.cn/news/356584.html

相关文章

870. 约数个数

给定 nn 个正整数 aiai&#xff0c;请你输出这些数的乘积的约数个数&#xff0c;答案对 10971097 取模。 输入格式 第一行包含整数 nn。 接下来 nn 行&#xff0c;每行包含一个整数 aiai。 输出格式 输出一个整数&#xff0c;表示所给正整数的乘积的约数个数&#xff0c;答…

骁龙870和麒麟980哪个好 骁龙870和麒麟980对比哪个更强

骁龙870搭载的新一代Kryo 585 CPU的性能提升25%&#xff0c;全新Adreno 650 GPU的整体性能较前代平台同样提升25%。为用户带来7nm的制作工艺&#xff0c;为用户带来最优的手机性能体验。 手机处理器选骁龙870还是麒麟980这些点很重要 看过你就懂了 http://shouji.adiannao.cn/7…

天玑810和骁龙870哪个好

骁龙870的整体规格与骁龙865 Plus保持一致&#xff0c;基于7nm工艺打造&#xff0c;并非最新的5nm&#xff0c;CPU采用一个大核心三个中核心四个小核心的设计。 选天玑810还是骁龙870这些点很重要 http://shouji.adiannao.cn/7 主要提升是在CPU的主频方面&#xff0c;其中超大核…

天玑1300和骁龙870哪个好 天玑1300和高通骁龙870差距

首先&#xff0c;Snapdragon 870 芯片组基于台积电的 7nm 制造工艺。该芯片组具有 1 个 3.2 GHz – Kryo 585 Prime (Cortex-A77) 内核、3 个 2.42 GHz – Kryo 585 Gold (Cortex-A77) 内核和 4 个 1.8 GHz – Kryo 585 Silver (Cortex-A55) 效率内核。另一方面&#xff0c;联发…

骁龙870和骁龙888哪个好 骁龙870和骁龙888对比性能差距

骁龙870&#xff1a;搭载7nm制作工艺&#xff0c;是一款制作工艺十分成熟的芯片 骁龙888&#xff1a;搭载5nm制作工艺&#xff0c;在晶体管密度方面远超7nm 手机处理器选骁龙870还是骁龙888这些点很重要 看过你就懂了 http://shouji.adiannao.cn/7 骁龙870&#xff1a;采用3.2G…

天玑8000和骁龙870哪个处理器好?

最近有不少用户问小编天玑8000和骁龙870相比哪个处理器好&#xff1f;天玑8000处理器是在目前市场上中高端的手机芯片&#xff0c;性能可以满足大部分用户&#xff0c;经过一部分的参数对比以及跑分测试&#xff0c;整体上天玑8000优于骁龙870处理器&#xff0c;下面就来看看具…

我的内网渗透-提权大法

拿到shell之后乱码解决 chcp 65001 #将编码设置为UTF-8的编码 出现这个提示就是切换成功&#xff0c;后面也是可以正常显示的 提权 方法一&#xff1a; 新版本的kali直接getsystem&#xff0c;可以提权成功&#xff08;有时候可以&#xff0c;有时候不可以&#xff09; mete…

谈谈几个常见数据结构的原理

数组 数组是最常用的数据结构&#xff0c;创建数组必须要内存中一块 连续 的空间&#xff0c;并且数组中必须存放 相同 的数据类型。比如我们创建一个长度为10&#xff0c;数据类型为整型的数组&#xff0c;在内存中的地址是从1000开始&#xff0c;那么它在内存中的存储格式如…