数据结构算法刷题(11)田忌赛马

该文章介绍了一个利用田忌赛马策略解决编程问题的方法。通过对两个数列进行排序,找到最优匹配,确保在不能改变nums2的情况下,优化nums1的匹配,以获得优势。通过遍历排序后的元素,确定每个元素的最佳位置,实现优势最大化。
摘要由CSDN通过智能技术生成

田忌赛马的主要思想是:如果劣等马能够比得过齐王的劣等马,就直接得分,如果比不过,就让它对阵齐王目前的最优马(挑最好的送人头)

由于我们不能改变nums2,所以我们取一个nums2递增排序后的索引值:

b = sorted(range(len(nums2)),key = lambda i:nums2[i])

若left= 0.right=len(nums1)-1

nums2[b[left]]就表示nums2中的最小值,nums2[b[right]]就表示nums2的最大值

将田忌的马nums1递增排序,用劣马对抗劣马,如果对抗不过就去齐王的最优马处送人头,然后right++,换剩下元素的最优值。

class Solution:

    def advantageCount(self, nums1: List[int], nums2: List[int]) -> List[int]:

        a = sorted(nums1)

        res = [0]*len(nums2)

        b = sorted(range(len(nums2)),key = lambda i:nums2[i])

        left = 0

        right = len(nums2) - 1

        for i in a:

            if i > nums2[b[left]]: #劣马是否能直接得分

                res[b[left]] = i  #将该值写入有优势的下标处

                left += 1 #指针向前移动,更换最小值

            else:  #劣马不能直接得分

                res[b[right]] = i #将该值写入nums2最大值的的位置

                right -= 1 #指针向后移动,更换最大值

        return res

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值