思路
题目的意思是田忌赛马,就是在nums1中选择比其大的最小数,若不存在这样的数字,则选择nums1中的最小值,用nums1的最小值比nums2的最小值,如果nums1的最小值比nums2的最小值大,就取nums1的最小值,如果小,否则就取用最小值去比nums2的最大值
输入:nums1 = [12,24,8,32], nums2 = [13,25,32,11]
输出:[24,32,8,12]
先把nums1排序变成8,12,24,32,再排序nums2,只排序下标为3,0,1,2,
初始化左指针为0指向nums2最小值,右指针为3
开始比较,8比11小,就用最差的马比最强的马,把8放到32的位置,右指针减1,变成2,此时结果数组为
【0,0,8,0】
12比11大,取当前马就行,然后就把12放到11的位置,左指针加1,变成1,此时结果数组为
【0,0,8,12】
24比13大,取当前马就行,然后就把24放到13的位置,左指针加1,变成2,此时结果数组为
【24,0,8,12】
32比25大,取当前马就行,然后就把32放到25的位置,左指针加1,变成3,此时结果数组为
【24,32,8,12】
\
代码实现
public int[] advantageCount(int[] nums1, int[] nums2) {
int length = nums1.length;
int[] res = new int[length];
Arrays.sort(nums1);
Integer[] ids = IntStream.range(0, length).boxed().toArray(Integer[]::new);
// 排序nums2,ids[0]是nums2最小值的下标
Arrays.sort(ids, Comparator.comparingInt(i -> nums2[i]));
// 双指针
int left = 0, right = length - 1;
for (int n : nums1) {
// nums1最小值是否比nums2最小值大,是的话则取nums1,否的话就取nums2最大值
// 如果nums1最小值比nums2中的最小值大,则本次res中nums1对应的下标为index[left],然后left++
// 否则本次res中nums1对应的下标为index[right],然后right--,用最差马比最强马
res[n > nums2[ids[left]] ? ids[left++] : ids[right--]] = n;
}
return res;
}