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

相关推荐
白榆maple20 分钟前
(蓝桥杯C/C++)——基础算法(下)
算法
JSU_曾是此间年少25 分钟前
数据结构——线性表与链表
数据结构·c++·算法
sjsjs1132 分钟前
【数据结构-合法括号字符串】【hard】【拼多多面试题】力扣32. 最长有效括号
数据结构·leetcode
此生只爱蛋1 小时前
【手撕排序2】快速排序
c语言·c++·算法·排序算法
blammmp1 小时前
Java:数据结构-枚举
java·开发语言·数据结构
昂子的博客2 小时前
基础数据结构——队列(链表实现)
数据结构
咕咕吖2 小时前
对称二叉树(力扣101)
算法·leetcode·职场和发展
九圣残炎2 小时前
【从零开始的LeetCode-算法】1456. 定长子串中元音的最大数目
java·算法·leetcode
lulu_gh_yu2 小时前
数据结构之排序补充
c语言·开发语言·数据结构·c++·学习·算法·排序算法
丫头,冲鸭!!!3 小时前
B树(B-Tree)和B+树(B+ Tree)
笔记·算法