题目描述:
给定两个大小相等的数组 nums1 和 nums2,nums1 相对于 nums 的优势可以用满足 nums1[i] > nums2[i] 的索引 i 的数目来描述。
返回 nums1 的任意排列,使其相对于 nums2 的优势最大化。
示例 1:
输入:nums1 = [2,7,11,15], nums2 = [1,10,4,11]
输出:[2,11,7,15]
示例 2:
输入:nums1 = [12,24,8,32], nums2 = [13,25,32,11]
输出:[24,32,8,12]
解题思路:
- 这道题目是田忌赛马的变种,也是运用到了贪心的思想;
- 如果当前A最大的牌是大于B中最大的牌的话,那么直接取到A中小于最大牌的下一个牌;
- 如果当前A最大的牌是小于B中最大的牌的话,那么直接取到A中最小的牌去消耗B中最大的牌;
实现代码:
class Solution {
public int[] advantageCount(int[] A, int[] B) {
//对A进行排序
Arrays.sort(A);
//B中的数字是需要记录位置的,需要记录位置,并对其进行排序
//降序排列
Queue<int[]> q = new PriorityQueue<>((a1,a2)->a2[0]-a1[0]);
//将B中的元素以及下标位置都存储起来
for(int i=0; i<B.length; i++){
q.add(new int[]{B[i],i});
}
int res[] = new int[A.length];
int lo=0, hi=A.length-1;
while(q.size()>0){
//当前B位置的最大数字
int num = q.peek()[0];
//对应的相应下标
int i = q.poll()[1];
//如果当前A最大的牌是大于B中最大的牌的话,那么直接取到A中小于最大牌的下一个牌
if(A[hi]>num){
res[i] = A[hi--];
}else{
//如果当前A最大的牌是小于B中最大的牌的话,那么直接取到A中最小的牌去消耗B中最大的牌
res[i] = A[lo++];
}
}
return res;
}
}
本文介绍了一种算法,通过合理排列数组nums1中的元素,使得其相对于另一个相同长度的数组nums2的优势最大化。此算法利用了贪心思想,类似于田忌赛马策略。
968

被折叠的 条评论
为什么被折叠?



