870.优势洗牌

116 阅读1分钟

题目:
给定两个大小相等的数组 nums1 和 nums2nums1 相对于 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)
}