【每日一道算法题系列】
思路:
主要考察的是贪心算法,使用局部的最优解作为全局的最优解
此题可以参考田忌赛马:
A与B按照从小到大的顺序比较(下等马/中等马/上等马的顺序),A如果比得过B,那么就是优势
如果比不过B,那么就用A当前最劣的那匹马,去拼掉B最好的那匹马
注意:
1 数组的排序,是根据数组元素的大小,然后对数组坐标进行排序
2 注意left与right两个指针的具体含义,代表的是num2中的最大最小值
public int[] advantageCount(int[] nums1, int[] nums2) {
int n = nums1.length;
//定义两个排序数组
Integer[] sortNums1 = new Integer[n];
Integer[] sortNums2 = new Integer[n];
//对两个数组的序号,进行初始化
for(int i = 0; i < n; i++) {
sortNums1[i] = i;
sortNums1[i] = i;
}
//按照从小到大的顺序进行排序
Arrays.sort(sortNums1, (i, j) -> nums1[i] - nums1[j]);
Arrays.sort(sortNums2, (i, j) -> nums2[i] - nums2[j]);
int[] ans = new int[n];
int left = 0, right = n - 1;
//田忌赛马原则
//两个数组排序后,按照排好的顺序进行遍历比较
//如果nums1数组的遍历的当前元素比nums2中最左侧的元素大
//那么久增加nums1的一点优势
//如果nums1数组的遍历的当前元素比nums2中最左侧的元素小
//那么说明,nums1中遍历的当前元素,没有比nums2中再大的元素了
//根据田忌赛马原则,nums1中的这个元素是下等马,那就有nums1下等马干掉nums2中的上等马,也就是nums2中最大的元素
for(int i = 0; i < n; i++) {
if(nums1[sortNums1[i]] > nums2[sortNums2[left]]) {
ans[sortNums2[left]] = nums1[sortNums1[i]];
left++;
}
else {
ans[sortNums2[right]] = nums1[sortNums1[i]];
right--;
}
}
return ans;
}