田忌赛马的故事大家都听说过,用自己最弱的去和对方最强的对抗
对于题目 优势洗牌 来说,我们把这个策略更明确一丢丢
「如果自己最强的可以战胜对方最强的,那么就直接用最强的去打;否则就用自己最弱的出战,降低损失」
按照这个思路,就可以给出完整代码:
public int[] advantageCount(int[] nums1, int[] nums2) {
Arrays.sort(nums1);
Queue<int[]> maxPQ = new PriorityQueue<>((a, b) -> b[1] - a[1]);
for (int i = 0; i < nums2.length; i++) maxPQ.offer(new int[]{i, nums2[i]});
// left 代表最弱的;right 代表最强的
int left = 0, right = nums1.length - 1;
int[] ans = new int[nums1.length];
while (!maxPQ.isEmpty()) {
int[] cur = maxPQ.poll();
int i = cur[0], maxValue = cur[1];
// 打得过
if (maxValue < nums1[right]) {
ans[i] = nums1[right];
right--;
} else {
ans[i] = nums1[left];
left++;
}
}
return ans;
}