田忌赛马的主要思想是:如果劣等马能够比得过齐王的劣等马,就直接得分,如果比不过,就让它对阵齐王目前的最优马(挑最好的送人头)
由于我们不能改变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