贪心算法学习------优势洗牌

贪心算法学习------优势洗牌_第1张图片

目录

一,题目

二,题目接口

三,解题思路和代码

全部代码: 


一,题目

给定两个数组nums1和nums2,nums1相对于nums2的优势可以用满足nums1[i]>nums2[i]的索引i的数目来描述。 返回nums1的任意排序,使其优势最大化。

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

二,题目接口

class Solution {
public:
    vector advantageCount(vector& nums1, vector& nums2) {

    }
};

三,解题思路和代码

 这道题运用的思想其实就是一种博弈思想,在历史上便是有名的田忌赛马问题的思想。

这个田忌赛马思想是这样的:

    1. 首先将田忌的马分为上,中,下等,王上的马分为上,中,下等。

     2.然后再来一个赛马,赛马的思路是这样的:

     我的下等马肯定比不过王上的下等马,所以我的下等马比不过王上的任何一匹马。 这个时候我便用我这条马把王上的上等马拖死。然后我再用我的上等马和王上的中等马赛马,再用我的中等马和王上的下等马赛马。这样我们便可以赢两场,取得赛马的总胜利。

将这个思想运用到我们这道题里面便是这样的一个步骤:

    首先以下面的示例为例:

输入:nums1 = [12,24,8,32],

           nums2 = [13,25,32,11]

输出:[24,32,8,12]

首先,我们先把nums2的下标给插入到数组Index当中。插入后是这样子的:

Index[0,1,2,3]。

 然后,根据nums2的元素大小来对这个下标数组中的元素进行排序。

排序后便成了这个样子:

Index[3,0,1,2]。

然后,我们再定义一个pos指向nums1的元素,left指向Index的最左元素,right指向Index的最右元素。

然后便是如下的在ret数组中的插入逻辑:

 while(pos

全部代码: 

class Solution {
public:
    vector advantageCount(vector& nums1, vector& nums2) {
          
          vectorindex;//下标数组
          vectorret(nums1.size());//结果数组

          for(int i = 0;i

你可能感兴趣的:(贪心算法学习,贪心算法,学习,算法,学习笔记,c++)