Advantage Shuffle

medium greedy two pointers sorting

Problem

Given two integer arrays nums1 and nums2 of equal length, permute nums1 so that the number of indices i with nums1[i] > nums2[i] is as large as possible. Return any such permutation.

Inputnums1 = [2,7,11,15], nums2 = [1,10,4,11]
Output[2,11,7,15]
Every position wins: 2>1, 11>10, 7>4, 15>11.

def advantage_count(nums1, nums2):
    s1 = sorted(nums1)
    idx = sorted(range(len(nums2)), key=lambda i: -nums2[i])
    res = [0] * len(nums1)
    lo, hi = 0, len(s1) - 1
    for i in idx:
        if s1[hi] > nums2[i]:
            res[i] = s1[hi]; hi -= 1
        else:
            res[i] = s1[lo]; lo += 1
    return res
function advantageCount(nums1, nums2) {
  const s1 = [...nums1].sort((a, b) => a - b);
  const idx = nums2.map((_, i) => i).sort((a, b) => nums2[b] - nums2[a]);
  const res = new Array(nums1.length);
  let lo = 0, hi = s1.length - 1;
  for (const i of idx) {
    if (s1[hi] > nums2[i]) res[i] = s1[hi--];
    else res[i] = s1[lo++];
  }
  return res;
}
int[] advantageCount(int[] nums1, int[] nums2) {
    int n = nums1.length;
    int[] s1 = nums1.clone();
    Arrays.sort(s1);
    Integer[] idx = new Integer[n];
    for (int i = 0; i < n; i++) idx[i] = i;
    Arrays.sort(idx, (a, b) -> nums2[b] - nums2[a]);
    int[] res = new int[n];
    int lo = 0, hi = n - 1;
    for (int i : idx) {
        if (s1[hi] > nums2[i]) res[i] = s1[hi--];
        else res[i] = s1[lo++];
    }
    return res;
}
vector<int> advantageCount(vector<int>& nums1, vector<int>& nums2) {
    int n = nums1.size();
    vector<int> s1 = nums1;
    sort(s1.begin(), s1.end());
    vector<int> idx(n);
    iota(idx.begin(), idx.end(), 0);
    sort(idx.begin(), idx.end(), [&](int a, int b){ return nums2[a] > nums2[b]; });
    vector<int> res(n);
    int lo = 0, hi = n - 1;
    for (int i : idx) {
        if (s1[hi] > nums2[i]) res[i] = s1[hi--];
        else res[i] = s1[lo++];
    }
    return res;
}
Time: O(n log n) Space: O(n)