题目:
给定两个大小相等的数组 nums1 和 nums2,nums1 相对于 nums 的优势可以用满足 nums1[i] > nums2[i] 的索引 i 的数目来描述。
返回 nums1 的任意排列,使其相对于 nums2 的优势最大化。
算法:
1.田忌赛马策略
2.注意理解优势的意义是排列nums1之后nums1[i]>nums2[i]的次数最多
3.注意边界条件,left=right的时候,还有一个数
import "sort"
func advantageCount(nums1 []int, nums2 []int) []int {
// 对于nums2中的每一个位置i,找到nums1中最小的大于nums2[i]的值
nums := make([][2]int, len(nums2))
for i := range nums2 {
nums[i] = [2]int{i, nums2[i]}
}
sort.Ints(nums1)
sort.Sort(Array(nums))
index := len(nums) - 1
ans := make([]int, len(nums1))
left, right := 0, len(nums1) - 1
for left < right {
if nums1[right] > nums[index][1] {
ans[nums[index][0]] = nums1[right]
right --
} else {
ans[nums[index][0]] = nums1[left]
left ++
}
index --
}
ans[nums[index][0]] = nums1[left]
return ans
}
type Array [][2]int
func (a Array) Less(i, j int) bool {
return a[i][1] < a[j][1]
}
func (a Array) Swap(i, j int) {
a[i], a[j] = a[j], a[i]
}
func (a Array) Len() int {
return len(a)
}