leetcode870.优势洗牌

题目描述:

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

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

示例一:

cpp 复制代码
输入:nums1 = [2,7,11,15], nums2 = [1,10,4,11]
输出:[2,11,7,15]

示例二:

cpp 复制代码
输入:nums1 = [12,24,8,32], nums2 = [13,25,32,11]
输出:[24,32,8,12]

问题解决:

本题主要是要将nums1对于nums2的优势最大化,其实就是将nums1打乱重组,使对应位置上的值

比nums2的值大的数目变的最多,所以我盟首先要做的工作是将两个数组排序,排序之后在通过比

比大小的方式俩对nums1进行重新排序,但是在比较的排序之前必须记录nums2的初识顺序,应为

要用nums2的初识顺序来决定nums1的最终顺序,我们可以用一个下标数组来记录nums2对应的下

标顺序,对应的具体代码如下:

cpp 复制代码
class Solution 
{
public:
    vector<int> advantageCount(vector<int>& nums1, vector<int>& nums2) 
    {
        //1.排序
        int n = nums1.size();
        sort(nums1.begin(),nums1.end());
        vector<int> index2(n);
        for(int i = 0;i < n;i++)
        {
            index2[i] = i;
        }
        sort(index2.begin(),index2.end(),[&](int i,int j)
        {
            return nums2[i] < nums2[j];
        });

        //2.田忌赛马
        vector<int> ret(n);
        int left = 0,right = n - 1;
        for(auto x: nums1)
        {
            if(x > nums2[index2[left]])
            {
                ret[index2[left++]] = x;
            }
            else
            {
                ret[index2[right--]] = x;
            }

        }
        return ret;

    }
};

对应以示例二进行演示代码:

由上图可知,在比较的时候其实nums2的位置没有发生真是改变,而是通过下标对应进行了对

nums2的排序,而最终在对nums1排序的时候使用的是田忌赛马的方法,如果nums1的最小比不

过nums2的最小,直接将nums1的最小放在最后,取对抗最大的那个数,反之,如果nums1对应的

位置数较大,直接用来对抗nums2对应位置的数,这就是这道题的基本原理,

相关推荐
脑子慢且灵3 分钟前
蓝桥杯冲刺:一维前缀和
算法·leetcode·职场和发展·蓝桥杯·动态规划·一维前缀和
姜威鱼28 分钟前
蓝桥杯python编程每日刷题 day 21
数据结构·算法·蓝桥杯
CYRUS STUDIO35 分钟前
Unidbg Trace 反 OLLVM 控制流平坦化(fla)
android·汇编·算法·网络安全·逆向·ollvm
ゞ 正在缓冲99%…43 分钟前
leetcode22.括号生成
java·算法·leetcode·回溯
小卡皮巴拉1 小时前
【力扣刷题实战】矩阵区域和
开发语言·c++·算法·leetcode·前缀和·矩阵
WG_171 小时前
第五章.图论
算法·图论
神里流~霜灭1 小时前
蓝桥备赛指南(12)· 省赛(构造or枚举)
c语言·数据结构·c++·算法·枚举·蓝桥·构造
小杨爱学习zb1 小时前
学习总结 网格划分+瞬态求解设置
笔记·学习·算法
双叶8362 小时前
(C语言)单链表(1.0)(单链表教程)(数据结构,指针)
c语言·开发语言·数据结构·算法·游戏
uhakadotcom2 小时前
OpenAI 的 PaperBench:AI 研究复现基准测试工具
算法·面试·github