田忌赛马的思路
如果田忌的马能赢,那就比赛,如果赢不了,那就换个垫底的来送人头,保存实力
def advantageCount(self, nums1, nums2):
"""
:type nums1: List[int]
:type nums2: List[int]
:rtype: List[int]
"""
n = len(nums1)
ans = [0]*n
nums1.sort(reverse = True)
idx = sorted(range(n),key = lambda i: nums2[i], reverse = True)
l = 0 #左边界最大值
r= n-1 #右边界最小值
for i in range(n): #一直和nums2里的最大值比
if nums1[l] > nums2[idx[i]]: #nums1最大的大于nums2最大的
ans[idx[i]] = nums1[l] #直接放一起比较
l += 1 #1里面最大值用过了要改变
else: #nums1最大的小于nums2最大的
ans[idx[i]] = nums1[r] #用1里面最小的放过来
r -= 1 #1里面最小值用过了要改变
return ans
反过来一样
def advantageCount(self, nums1: List[int], nums2: List[int]) -> List[int]:
n = len(nums1)
ans = [0] * n
nums1.sort()
ids = sorted(range(n), key=lambda i: nums2[i])
left, right = 0, n - 1
for x in nums1:
if x > nums2[ids[left]]:
ans[ids[left]] = x # 用下等马比下等马
left += 1
else:
ans[ids[right]] = x # 用下等马比上等马
right -= 1
return ans