优势洗牌
难度:
标签:
题目描述
代码结果
运行时间: 108 ms, 内存: 33.1 MB
/*
* 思路:
* 使用Java Stream的方式来实现优势洗牌。
* 首先将nums1和nums2进行排序,并保留nums2的索引。
* 然后使用双指针来分配nums1中的元素。
*/
import java.util.Arrays;
import java.util.stream.IntStream;
public class SolutionStream {
public int[] advantageCount(int[] nums1, int[] nums2) {
Arrays.sort(nums1);
int n = nums1.length;
int[] result = new int[n];
Integer[] indices = IntStream.range(0, n).boxed().toArray(Integer[]::new);
Arrays.sort(indices, (a, b) -> Integer.compare(nums2[a], nums2[b]));
int left = 0, right = n - 1;
for (int num : nums1) {
if (num > nums2[indices[left]]) {
result[indices[left]] = num;
left++;
} else {
result[indices[right]] = num;
right--;
}
}
return result;
}
}
解释
方法:
这个题解采用了贪心算法的思想。首先,对nums1进行排序,以便尽可能将较小的值与nums2中较小的值匹配。同时,对nums2的索引进行排序,基于nums2的值进行排序,以便我们可以从nums2的最小值开始尝试匹配。接着,我们遍历排序后的nums1,尝试为每个nums2中的值找到一个大于它的最小nums1中的值。如果nums1中的当前值大于nums2中当前考虑的最小值,我们就把这个值分配给它,以此来最大化优势。如果不大于,则把这个值分配给当前nums2中的最大值的位置,尽可能减小'损失'。通过这种方式,我们可以保证nums1的优势最大化。
时间复杂度:
O(n log n)
空间复杂度:
O(n)
代码细节讲解
🦆
为什么在实现算法时选择对 nums1 进行排序,而 nums2 只对索引进行排序而不是直接对数组排序?
▷🦆
在算法中,将不能优势的 nums1 值分配给当前 nums2 的最大值位置,这种策略是如何帮助减小损失的?
▷🦆
算法中提及使用双指针 L 和 R,这种双指针策略在这个特定问题中是如何工作的?能否详细解释双指针的移动规则和它们各自的作用?
▷