|
40 | 40 |
|
41 | 41 | <!-- 这里可写通用的实现逻辑 -->
|
42 | 42 |
|
| 43 | +**方法一:贪心 + 排序** |
| 44 | + |
| 45 | +类似田忌赛马。将 $nums1$, $nums2$ 按照升序排列。然后遍历 $nums1$ 中的每个元素 $v$,若在 $nums2[i..j]$ 中找不到比 $v$ 小的,则将 $v$ 与当前 $nums2[i..j]$ 中的最大元素匹配。 |
| 46 | + |
| 47 | +时间复杂度 $O(nlogn)$。 |
| 48 | + |
43 | 49 | <!-- tabs:start -->
|
44 | 50 |
|
45 | 51 | ### **Python3**
|
46 | 52 |
|
47 | 53 | <!-- 这里可写当前语言的特殊实现逻辑 -->
|
48 | 54 |
|
49 | 55 | ```python
|
50 |
| - |
| 56 | +class Solution: |
| 57 | + def advantageCount(self, nums1: List[int], nums2: List[int]) -> List[int]: |
| 58 | + nums1.sort() |
| 59 | + t = [(v, i) for i, v in enumerate(nums2)] |
| 60 | + t.sort() |
| 61 | + n = len(nums2) |
| 62 | + ans = [0] * n |
| 63 | + i, j = 0, n - 1 |
| 64 | + for v in nums1: |
| 65 | + if v <= t[i][0]: |
| 66 | + ans[t[j][1]] = v |
| 67 | + j -= 1 |
| 68 | + else: |
| 69 | + ans[t[i][1]] = v |
| 70 | + i += 1 |
| 71 | + return ans |
51 | 72 | ```
|
52 | 73 |
|
53 | 74 | ### **Java**
|
54 | 75 |
|
55 | 76 | <!-- 这里可写当前语言的特殊实现逻辑 -->
|
56 | 77 |
|
57 | 78 | ```java
|
| 79 | +class Solution { |
| 80 | + public int[] advantageCount(int[] nums1, int[] nums2) { |
| 81 | + int n = nums1.length; |
| 82 | + int[][] t = new int[n][2]; |
| 83 | + for (int i = 0; i < n; ++i) { |
| 84 | + t[i] = new int[]{nums2[i], i}; |
| 85 | + } |
| 86 | + Arrays.sort(t, (a, b) -> a[0] - b[0]); |
| 87 | + Arrays.sort(nums1); |
| 88 | + int[] ans = new int[n]; |
| 89 | + int i = 0, j = n - 1; |
| 90 | + for (int v : nums1) { |
| 91 | + if (v <= t[i][0]) { |
| 92 | + ans[t[j--][1]] = v; |
| 93 | + } else { |
| 94 | + ans[t[i++][1]] = v; |
| 95 | + } |
| 96 | + } |
| 97 | + return ans; |
| 98 | + } |
| 99 | +} |
| 100 | +``` |
| 101 | + |
| 102 | +### **C++** |
| 103 | + |
| 104 | +```cpp |
| 105 | +class Solution { |
| 106 | +public: |
| 107 | + vector<int> advantageCount(vector<int>& nums1, vector<int>& nums2) { |
| 108 | + int n = nums1.size(); |
| 109 | + vector<pair<int, int>> t; |
| 110 | + for (int i = 0; i < n; ++i) t.push_back({nums2[i], i}); |
| 111 | + sort(t.begin(), t.end()); |
| 112 | + sort(nums1.begin(), nums1.end()); |
| 113 | + int i = 0, j = n - 1; |
| 114 | + vector<int> ans(n); |
| 115 | + for (int v : nums1) |
| 116 | + { |
| 117 | + if (v <= t[i].first) ans[t[j--].second] = v; |
| 118 | + else ans[t[i++].second] = v; |
| 119 | + } |
| 120 | + return ans; |
| 121 | + } |
| 122 | +}; |
| 123 | +``` |
58 | 124 |
|
| 125 | +### **Go** |
| 126 | +
|
| 127 | +```go |
| 128 | +func advantageCount(nums1 []int, nums2 []int) []int { |
| 129 | + n := len(nums1) |
| 130 | + t := make([][]int, n) |
| 131 | + for i, v := range nums2 { |
| 132 | + t[i] = []int{v, i} |
| 133 | + } |
| 134 | + sort.Slice(t, func(i, j int) bool { |
| 135 | + return t[i][0] < t[j][0] |
| 136 | + }) |
| 137 | + sort.Ints(nums1) |
| 138 | + ans := make([]int, n) |
| 139 | + i, j := 0, n-1 |
| 140 | + for _, v := range nums1 { |
| 141 | + if v <= t[i][0] { |
| 142 | + ans[t[j][1]] = v |
| 143 | + j-- |
| 144 | + } else { |
| 145 | + ans[t[i][1]] = v |
| 146 | + i++ |
| 147 | + } |
| 148 | + } |
| 149 | + return ans |
| 150 | +} |
59 | 151 | ```
|
60 | 152 |
|
61 | 153 | ### **...**
|
|
0 commit comments