Skip to content

Commit 61d0b3c

Browse files
committed
feat: add solutions to lc problem: No.0870
No.0870.Advantage Shuffle
1 parent 90ebdd0 commit 61d0b3c

File tree

6 files changed

+258
-2
lines changed

6 files changed

+258
-2
lines changed

solution/0800-0899/0870.Advantage Shuffle/README.md

+93-1
Original file line numberDiff line numberDiff line change
@@ -40,22 +40,114 @@
4040

4141
<!-- 这里可写通用的实现逻辑 -->
4242

43+
**方法一:贪心 + 排序**
44+
45+
类似田忌赛马。将 $nums1$, $nums2$ 按照升序排列。然后遍历 $nums1$ 中的每个元素 $v$,若在 $nums2[i..j]$ 中找不到比 $v$ 小的,则将 $v$ 与当前 $nums2[i..j]$ 中的最大元素匹配。
46+
47+
时间复杂度 $O(nlogn)$。
48+
4349
<!-- tabs:start -->
4450

4551
### **Python3**
4652

4753
<!-- 这里可写当前语言的特殊实现逻辑 -->
4854

4955
```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
5172
```
5273

5374
### **Java**
5475

5576
<!-- 这里可写当前语言的特殊实现逻辑 -->
5677

5778
```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+
```
58124
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+
}
59151
```
60152

61153
### **...**

solution/0800-0899/0870.Advantage Shuffle/README_EN.md

+87-1
Original file line numberDiff line numberDiff line change
@@ -32,13 +32,99 @@
3232
### **Python3**
3333

3434
```python
35-
35+
class Solution:
36+
def advantageCount(self, nums1: List[int], nums2: List[int]) -> List[int]:
37+
nums1.sort()
38+
t = [(v, i) for i, v in enumerate(nums2)]
39+
t.sort()
40+
n = len(nums2)
41+
ans = [0] * n
42+
i, j = 0, n - 1
43+
for v in nums1:
44+
if v <= t[i][0]:
45+
ans[t[j][1]] = v
46+
j -= 1
47+
else:
48+
ans[t[i][1]] = v
49+
i += 1
50+
return ans
3651
```
3752

3853
### **Java**
3954

4055
```java
56+
class Solution {
57+
public int[] advantageCount(int[] nums1, int[] nums2) {
58+
int n = nums1.length;
59+
int[][] t = new int[n][2];
60+
for (int i = 0; i < n; ++i) {
61+
t[i] = new int[]{nums2[i], i};
62+
}
63+
Arrays.sort(t, (a, b) -> a[0] - b[0]);
64+
Arrays.sort(nums1);
65+
int[] ans = new int[n];
66+
int i = 0, j = n - 1;
67+
for (int v : nums1) {
68+
if (v <= t[i][0]) {
69+
ans[t[j--][1]] = v;
70+
} else {
71+
ans[t[i++][1]] = v;
72+
}
73+
}
74+
return ans;
75+
}
76+
}
77+
```
78+
79+
### **C++**
80+
81+
```cpp
82+
class Solution {
83+
public:
84+
vector<int> advantageCount(vector<int>& nums1, vector<int>& nums2) {
85+
int n = nums1.size();
86+
vector<pair<int, int>> t;
87+
for (int i = 0; i < n; ++i) t.push_back({nums2[i], i});
88+
sort(t.begin(), t.end());
89+
sort(nums1.begin(), nums1.end());
90+
int i = 0, j = n - 1;
91+
vector<int> ans(n);
92+
for (int v : nums1)
93+
{
94+
if (v <= t[i].first) ans[t[j--].second] = v;
95+
else ans[t[i++].second] = v;
96+
}
97+
return ans;
98+
}
99+
};
100+
```
41101
102+
### **Go**
103+
104+
```go
105+
func advantageCount(nums1 []int, nums2 []int) []int {
106+
n := len(nums1)
107+
t := make([][]int, n)
108+
for i, v := range nums2 {
109+
t[i] = []int{v, i}
110+
}
111+
sort.Slice(t, func(i, j int) bool {
112+
return t[i][0] < t[j][0]
113+
})
114+
sort.Ints(nums1)
115+
ans := make([]int, n)
116+
i, j := 0, n-1
117+
for _, v := range nums1 {
118+
if v <= t[i][0] {
119+
ans[t[j][1]] = v
120+
j--
121+
} else {
122+
ans[t[i][1]] = v
123+
i++
124+
}
125+
}
126+
return ans
127+
}
42128
```
43129

44130
### **...**
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
class Solution {
2+
public:
3+
vector<int> advantageCount(vector<int>& nums1, vector<int>& nums2) {
4+
int n = nums1.size();
5+
vector<pair<int, int>> t;
6+
for (int i = 0; i < n; ++i) t.push_back({nums2[i], i});
7+
sort(t.begin(), t.end());
8+
sort(nums1.begin(), nums1.end());
9+
int i = 0, j = n - 1;
10+
vector<int> ans(n);
11+
for (int v : nums1)
12+
{
13+
if (v <= t[i].first) ans[t[j--].second] = v;
14+
else ans[t[i++].second] = v;
15+
}
16+
return ans;
17+
}
18+
};
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
func advantageCount(nums1 []int, nums2 []int) []int {
2+
n := len(nums1)
3+
t := make([][]int, n)
4+
for i, v := range nums2 {
5+
t[i] = []int{v, i}
6+
}
7+
sort.Slice(t, func(i, j int) bool {
8+
return t[i][0] < t[j][0]
9+
})
10+
sort.Ints(nums1)
11+
ans := make([]int, n)
12+
i, j := 0, n-1
13+
for _, v := range nums1 {
14+
if v <= t[i][0] {
15+
ans[t[j][1]] = v
16+
j--
17+
} else {
18+
ans[t[i][1]] = v
19+
i++
20+
}
21+
}
22+
return ans
23+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
class Solution {
2+
public int[] advantageCount(int[] nums1, int[] nums2) {
3+
int n = nums1.length;
4+
int[][] t = new int[n][2];
5+
for (int i = 0; i < n; ++i) {
6+
t[i] = new int[]{nums2[i], i};
7+
}
8+
Arrays.sort(t, (a, b) -> a[0] - b[0]);
9+
Arrays.sort(nums1);
10+
int[] ans = new int[n];
11+
int i = 0, j = n - 1;
12+
for (int v : nums1) {
13+
if (v <= t[i][0]) {
14+
ans[t[j--][1]] = v;
15+
} else {
16+
ans[t[i++][1]] = v;
17+
}
18+
}
19+
return ans;
20+
}
21+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
class Solution:
2+
def advantageCount(self, nums1: List[int], nums2: List[int]) -> List[int]:
3+
nums1.sort()
4+
t = [(v, i) for i, v in enumerate(nums2)]
5+
t.sort()
6+
n = len(nums2)
7+
ans = [0] * n
8+
i, j = 0, n - 1
9+
for v in nums1:
10+
if v <= t[i][0]:
11+
ans[t[j][1]] = v
12+
j -= 1
13+
else:
14+
ans[t[i][1]] = v
15+
i += 1
16+
return ans

0 commit comments

Comments
 (0)