每日一题|2022-10-8|870. 优势洗牌

news/2024/11/9 4:47:37/

870. 优势洗牌

        给定两个大小相等的数组 nums1 和 nums2,nums1 相对于 nums2 的优势可以用满足 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]

思路:田忌赛马

        用垃圾🐎战胜对方的垃圾🐎,如果我方垃圾🐎不能战胜对方垃圾🐎,就让我方去和对面最强的🐎同归于尽。

        这里是我可以任意排列我方的马,然后去对战对面的马,每只马只能出场一次。所以思路就是我方弱的如果能打败对方弱的,就打,打不过对方弱的,就去和对方最强的同归于尽。

在代码实现方面,要注意的就是提到的说由于nums2不能排序,所以要创建一个下标数组ids。然后对ids进行排序,让ids[0]对应于nums2最小的下标,让ids[1]对应于nums2第二小的下标,.....以此类推。然后用双指针left和right操作ids,从而知道每个下标所要对应的nums1的元素,也就找到了所要求的nums1的排列。

        举个例子:

nums1 = [2,7,11,15],    nums2 = [1,10,4,11]

        1、我们新建一个ids下标数组。ids = [0,1,2,3]       // 里面的值只是初始化和下标一样

        2、排序ids。我们需要让ids的下标对应到nums2中的值从小到大的下标。举个例子,ids[0]要对应到nums2中值为1的下标,即ids[0]=0。ids[1]要对应到nums2中值为4的下标,即ids[1]=2.

        那么排序后的ids为 [0, 2, 1, 3],下标是0,1,2,3

        3、用双指针left=0和right=len(n)-1,操作ids。我们去遍历nums1中的值(排序过的),假设v是其值,我们判断v是否大于nums2[ids[left]],如果v(我方最菜)大于对面最菜,那么我们就可以排列我方这个值放在对面这个值所在的下标中,即ans[ids[left]] = v。如果我方最菜v小于对方最菜,那么我们就将这个值放在对面最强值所在的下标ids[right],即ans[ids[right]] = v。直到排列完我方所有人员,就完成了所需要的排列组合。

func advantageCount(nums1 []int, nums2 []int) []int {n := len(nums1)ans := make([]int,n)    // 用来存放结果的nums1的排列阵营sort.Ints(nums1)    // 先给nums1排序,从小到大ids := make([]int, n )  // 创建一个下标数组,内容为nums2值从小到大的所对应的下标。即nums[ids[0]] = nums[最菜的]、以此类推for i:=0;i<n;i++{   // 先给数组下标初始化一下,值就是下标,这里是初始化还没排序。ids[i] = i}sort.Slice(ids, func(i,j int) bool {    // 排序数组下标,排序方式是按照ids的值作为下标在nums2中从小到大排序。return nums2[ids[i]] < nums2[ids[j]]    // 排序完成后 nums[ids[i]] = nums[第i菜的下标] })left, right := 0, n-1   // 用双指针,left指向最菜的,right指向最强的for _, v := range nums1 {   // 开始遍历nums1,依次决定我方从最菜到最强应该放在哪个位置才能战胜对方。if v > nums2[ids[left]] {   // 如果我方第一个最菜大于对方第一个最菜,那么我方这个值就可以放在对面所在的下标位置。ans[ids[left]] = vleft++} else {ans[ids[right]] = v     // 如果我方最菜比对方最菜还菜,那么我方最菜的值放到对面最强所在的下标位置。right--}}return ans
}

图中的orderPos就是上面说的下标数组ids。

 

 

后面的操作以此类推即可,我就不再画下去了。

 图片来自于【爪哇缪斯】图解LeetCode。

 

 

 


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

相关文章

【870. 优势洗牌】

来源&#xff1a;力扣&#xff08;LeetCode&#xff09; 描述&#xff1a; 给定两个大小相等的数组 nums1 和 nums2&#xff0c;nums1 相对于 nums 的优势可以用满足 nums1[i] > nums2[i] 的索引 i 的数目来描述。 返回 nums1 的任意排列&#xff0c;使其相对于 nums2 的优…

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…