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对应位置的数,这就是这道题的基本原理,

相关推荐
syzyc30 分钟前
[ABC267F] Exactly K Steps
数据结构·动态规划·题解
向阳逐梦1 小时前
PID控制算法理论学习基础——单级PID控制
人工智能·算法
2zcode1 小时前
基于Matlab多特征融合的可视化指纹识别系统
人工智能·算法·matlab
Owen_Q1 小时前
Leetcode百题斩-二分搜索
算法·leetcode·职场和发展
矢志航天的阿洪2 小时前
蒙特卡洛树搜索方法实践
算法
草莓熊Lotso2 小时前
【数据结构初阶】--顺序表(二)
c语言·数据结构·经验分享·其他
汤姆爱耗儿药2 小时前
数据结构——散列表
数据结构·散列表
UnderTheTime2 小时前
2025 XYD Summer Camp 7.10 筛法
算法
zstar-_2 小时前
Claude code在Windows上的配置流程
笔记·算法·leetcode
圆头猫爹3 小时前
第34次CCF-CSP认证第4题,货物调度
c++·算法·动态规划