田忌赛马
基于labuladong的算法网站,田忌赛马背后的算法决策
1、概述
田忌赛马的核心是在于尽可能地让自己占便宜,让对方吃亏。
力扣第870题,优势洗牌,两个长度相等的数组,重新组织num1的元素位置,让num1的元素尽可能地大于nums2相同位置处的元素。
2、代码实现
因为结果依赖于nums2的元素位置,所以不能随便将数组nums2进行排序,需要依赖特殊的结构,优先级队列,进行数组元素下标和数组元素的一一对应:
[870]优势洗牌
//leetcode submit region begin(Prohibit modification and deletion)
class Solution {
public int[] advantageCount(int[] nums1, int[] nums2) {
// 先将数组nums1进行从小到大的排序
Arrays.sort(nums1);
// 需要用优先级队列
// (优先级队列中存储的是一个数组,数组有两个元素,第一个元素代表下标,第二个元素为nums2中该下标的元素值)
// 按照从大到小的顺序进行排列
PriorityQueue<int[]> queue = new PriorityQueue<>((int[] a, int[] b) -> {
return b[1] - a[1];
});
for (int i = 0; i < nums2.length; i++) {
queue.add(new int[]{i, nums2[i]});
}
// 开始进行田忌赛马
int left = 0, right = nums1.length - 1;
int[] res = new int[nums1.length];// 返回的结果
int index = 0;
while (!queue.isEmpty()) {
int[] temp = queue.poll();// 将优先级队列中的最大元素弹出
if (temp[1] >= nums1[right]) {
res[temp[0]] = nums1[left++];
} else {
res[temp[0]] = nums1[right--];
}
}
return res;
}
}