田忌赛马的故事大家都听说过,用自己最弱的去和对方最强的对抗
对于题目 优势洗牌 来说,我们把这个策略更明确一丢丢
「如果自己最强的可以战胜对方最强的,那么就直接用最强的去打;否则就用自己最弱的出战,降低损失」
按照这个思路,就可以给出完整代码:
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;}