这道题就是使用贪心,
首先先对nums1和nums2进行从小到大排序
然后判断nums1的首元素和nums2的首元素的大小
如果nums1大于nums2,那么说明这个nums1中的元素是有效的,可以作为返回值
如果nums1小于等于nums2,那么说明这个值对于nums2是比不过的,所以我们可以让这个值去匹配nums2中的最大值,也就是田忌赛马中让劣马匹配优马的原理
主要的贪心思想就是这些。
但是这题的关键是返回数组的对应情况。
我们可以巧妙的使用一个数组来记录nums1和nums2的下标,然后根据nums1和nums2的大小对下标数组进行排序,这是一个很巧妙的思想,这样我们就不必对原数组nums1和nums2进行排序,不会破坏nums2的顺序,这样返回数组的顺序也就好实现了
class Solution {
public int[] advantageCount(int[] nums1, int[] nums2) {
int n=nums1.length;
Integer[] idx1=new Integer[n];
Integer[] idx2=new Integer[n];
//先记录每一个对应的坐标
for(int i=0;i<n;i++){
idx1[i]=i;
idx2[i]=i;
}
//然后根据nums1和nums2的大小对坐标数组排序
int[] res=new int[n];
Arrays.sort(idx1,(i,j)->nums1[i]-nums1[j]);
Arrays.sort(idx2,(i,j)->nums2[i]-nums2[j]);
int left=0,right=n-1;
for(int i=0;i<n;i++){
//对nums1和nums2从小到大进行比较
//如果nums1比较大,那么它就是有效的
if(nums1[idx1[i]]>nums2[idx2[left]]){
res[idx2[left]]=nums1[idx1[i]];
left++;
}else{
res[idx2[right]]=nums1[idx1[i]];
right--;
}
}
return res;
}
}