在实际的代码编写中,我们无需真正地「移除」元素。对于 nums}_1,我们使用一个循环依次遍历其中的每个元素;对于 nums}_2,我们可以使用双指针 left 和 right。如果 nums}_1 的首个元素可以增加「优势」,就配对 left 对应的元素并向右移动一个位置;如果无法配对,就配对 right 对应的元素并向左移动一个位置。
int[] ans = newint[n]; int left = 0, right = n - 1; for (int i = 0; i < n; ++i) { if (nums1[idx1[i]] > nums2[idx2[left]]) { ans[idx2[left]] = nums1[idx1[i]]; ++left; } else { ans[idx2[right]] = nums1[idx1[i]]; --right; } } return ans; } }
ans = [0] * n left, right = 0, n - 1 for i inrange(n): if nums1[idx1[i]] > nums2[idx2[left]]: ans[idx2[left]] = nums1[idx1[i]] left += 1 else: ans[idx2[right]] = nums1[idx1[i]] right -= 1 return ans
staticintcmp(constvoid *pa, constvoid *pb) { int *a = (int *)pa; int *b = (int *)pb; return a[1] - b[1]; }
int* advantageCount(int* nums1, int nums1Size, int* nums2, int nums2Size, int* returnSize) { int n = nums1Size; int idx1[n][2], idx2[n][2]; for (int i = 0; i < n; i++) { idx1[i][0] = i, idx1[i][1] = nums1[i]; idx2[i][0] = i, idx2[i][1] = nums2[i]; } qsort(idx1, n, sizeof(idx1[0]), cmp); qsort(idx2, n, sizeof(idx2[0]), cmp); int *ans = (int *)malloc(sizeof(int) * n); int left = 0, right = n - 1; for (int i = 0; i < n; ++i) { if (nums1[idx1[i][0]] > nums2[idx2[left][0]]) { ans[idx2[left][0]] = nums1[idx1[i][0]]; ++left; } else { ans[idx2[right][0]] = nums1[idx1[i][0]]; --right; } } *returnSize = n; return ans; }
var advantageCount = function(nums1, nums2) { const n = nums1.length; const idx1 = newArray(n).fill(0); const idx2 = newArray(n).fill(0); for (let i = 0; i < n; ++i) { idx1[i] = i; idx2[i] = i; } idx1.sort((i, j) => nums1[i] - nums1[j]); idx2.sort((i, j) => nums2[i] - nums2[j]);
const ans = newArray(n).fill(0); let left = 0, right = n - 1; for (let i = 0; i < n; ++i) { if (nums1[idx1[i]] > nums2[idx2[left]]) { ans[idx2[left]] = nums1[idx1[i]]; ++left; } else { ans[idx2[right]] = nums1[idx1[i]]; --right; } } return ans; };