Skip to content

Commit 61ecd8f

Browse files
committed
feat: update solutions to lc problem: No.1282
No.1282.Group the People Given the Group Size They Belong To
1 parent e1e03d3 commit 61ecd8f

File tree

6 files changed

+113
-117
lines changed

6 files changed

+113
-117
lines changed

solution/1200-1299/1282.Group the People Given the Group Size They Belong To/README.md

Lines changed: 43 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,14 @@
4949

5050
<!-- 这里可写通用的实现逻辑 -->
5151

52+
**方法一:哈希表或数组**
53+
54+
我们用一个哈希表 $g$ 来存放每个 $groupSize$ 都有哪些人。然后对每个 $groupSize$ 中的人划分为 $k 等份,每一等份有 $groupSize$ 个人。
55+
56+
由于题目中的 $n$ 范围较小,我们也可以直接创建一个大小为 $n+1$ 的数组来存放数据,运行效率较高。
57+
58+
时间复杂度 $O(n)$,空间复杂度 $O(n)$。
59+
5260
<!-- tabs:start -->
5361

5462
### **Python3**
@@ -58,15 +66,10 @@
5866
```python
5967
class Solution:
6068
def groupThePeople(self, groupSizes: List[int]) -> List[List[int]]:
61-
mp = defaultdict(list)
62-
for i, x in enumerate(groupSizes):
63-
mp[x].append(i)
64-
res = []
65-
for x, indexes in mp.items():
66-
l = len(indexes)
67-
for i in range(0, l, x):
68-
res.append(indexes[i: i + x])
69-
return res
69+
g = defaultdict(list)
70+
for i, v in enumerate(groupSizes):
71+
g[v].append(i)
72+
return [v[j: j + i] for i, v in g.items() for j in range(0, len(v), i)]
7073
```
7174

7275
### **Java**
@@ -76,19 +79,22 @@ class Solution:
7679
```java
7780
class Solution {
7881
public List<List<Integer>> groupThePeople(int[] groupSizes) {
79-
Map<Integer, List<Integer>> mp = new HashMap<>();
80-
for (int i = 0; i < groupSizes.length; ++i) {
81-
mp.computeIfAbsent(groupSizes[i], k -> new ArrayList<>()).add(i);
82+
int n = groupSizes.length;
83+
List<Integer>[] g = new List[n + 1];
84+
for (int i = 0; i < g.length; ++i) {
85+
g[i] = new ArrayList<>();
86+
}
87+
for (int i = 0; i < n; ++i) {
88+
g[groupSizes[i]].add(i);
8289
}
83-
List<List<Integer>> res = new ArrayList<>();
84-
for (Map.Entry<Integer, List<Integer>> entry : mp.entrySet()) {
85-
int x = entry.getKey();
86-
List<Integer> indexes = entry.getValue();
87-
for (int i = 0; i < indexes.size(); i += x) {
88-
res.add(new ArrayList<>(indexes.subList(i, i + x)));
90+
List<List<Integer>> ans = new ArrayList<>();
91+
for (int i = 0; i < g.length; ++i) {
92+
List<Integer> v = g[i];
93+
for (int j = 0; j < v.size(); j += i) {
94+
ans.add(v.subList(j, j + i));
8995
}
9096
}
91-
return res;
97+
return ans;
9298
}
9399
}
94100
```
@@ -99,20 +105,17 @@ class Solution {
99105
class Solution {
100106
public:
101107
vector<vector<int>> groupThePeople(vector<int>& groupSizes) {
102-
unordered_map<int, vector<int>> mp;
103-
for (int i = 0; i < groupSizes.size(); ++i) mp[groupSizes[i]].push_back(i);
104-
vector<vector<int>> res;
105-
for (auto& entry : mp)
106-
{
107-
int x = entry.first;
108-
auto indexes = entry.second;
109-
for (int i = 0; i < indexes.size(); i += x)
110-
{
111-
vector<int> t(indexes.begin() + i, indexes.begin() + i + x);
112-
res.push_back(t);
108+
int n = groupSizes.size();
109+
vector<vector<int>> g(n + 1);
110+
for (int i = 0; i < n; ++i) g[groupSizes[i]].push_back(i);
111+
vector<vector<int>> ans;
112+
for (int i = 0; i < g.size(); ++i) {
113+
for (int j = 0; j < g[i].size(); j += i) {
114+
vector<int> t(g[i].begin() + j, g[i].begin() + j + i);
115+
ans.push_back(t);
113116
}
114117
}
115-
return res;
118+
return ans;
116119
}
117120
};
118121
```
@@ -121,17 +124,18 @@ public:
121124
122125
```go
123126
func groupThePeople(groupSizes []int) [][]int {
124-
mp := make(map[int][]int)
125-
for i, x := range groupSizes {
126-
mp[x] = append(mp[x], i)
127+
n := len(groupSizes)
128+
g := make([][]int, n+1)
129+
for i, v := range groupSizes {
130+
g[v] = append(g[v], i)
127131
}
128-
var res [][]int
129-
for x, indexes := range mp {
130-
for i := 0; i < len(indexes); i += x {
131-
res = append(res, indexes[i:i+x])
132+
ans := [][]int{}
133+
for i, v := range g {
134+
for j := 0; j < len(v); j += i {
135+
ans = append(ans, v[j:j+i])
132136
}
133137
}
134-
return res
138+
return ans
135139
}
136140
```
137141

solution/1200-1299/1282.Group the People Given the Group Size They Belong To/README_EN.md

Lines changed: 35 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -50,35 +50,33 @@ Other possible solutions are [[2,1,6],[5],[0,4,3]] and [[5],[0,6,2],[4,3,1]].
5050
```python
5151
class Solution:
5252
def groupThePeople(self, groupSizes: List[int]) -> List[List[int]]:
53-
mp = defaultdict(list)
54-
for i, x in enumerate(groupSizes):
55-
mp[x].append(i)
56-
res = []
57-
for x, indexes in mp.items():
58-
l = len(indexes)
59-
for i in range(0, l, x):
60-
res.append(indexes[i: i + x])
61-
return res
53+
g = defaultdict(list)
54+
for i, v in enumerate(groupSizes):
55+
g[v].append(i)
56+
return [v[j: j + i] for i, v in g.items() for j in range(0, len(v), i)]
6257
```
6358

6459
### **Java**
6560

6661
```java
6762
class Solution {
6863
public List<List<Integer>> groupThePeople(int[] groupSizes) {
69-
Map<Integer, List<Integer>> mp = new HashMap<>();
70-
for (int i = 0; i < groupSizes.length; ++i) {
71-
mp.computeIfAbsent(groupSizes[i], k -> new ArrayList<>()).add(i);
64+
int n = groupSizes.length;
65+
List<Integer>[] g = new List[n + 1];
66+
for (int i = 0; i < g.length; ++i) {
67+
g[i] = new ArrayList<>();
7268
}
73-
List<List<Integer>> res = new ArrayList<>();
74-
for (Map.Entry<Integer, List<Integer>> entry : mp.entrySet()) {
75-
int x = entry.getKey();
76-
List<Integer> indexes = entry.getValue();
77-
for (int i = 0; i < indexes.size(); i += x) {
78-
res.add(new ArrayList<>(indexes.subList(i, i + x)));
69+
for (int i = 0; i < n; ++i) {
70+
g[groupSizes[i]].add(i);
71+
}
72+
List<List<Integer>> ans = new ArrayList<>();
73+
for (int i = 0; i < g.length; ++i) {
74+
List<Integer> v = g[i];
75+
for (int j = 0; j < v.size(); j += i) {
76+
ans.add(v.subList(j, j + i));
7977
}
8078
}
81-
return res;
79+
return ans;
8280
}
8381
}
8482
```
@@ -89,20 +87,17 @@ class Solution {
8987
class Solution {
9088
public:
9189
vector<vector<int>> groupThePeople(vector<int>& groupSizes) {
92-
unordered_map<int, vector<int>> mp;
93-
for (int i = 0; i < groupSizes.size(); ++i) mp[groupSizes[i]].push_back(i);
94-
vector<vector<int>> res;
95-
for (auto& entry : mp)
96-
{
97-
int x = entry.first;
98-
auto indexes = entry.second;
99-
for (int i = 0; i < indexes.size(); i += x)
100-
{
101-
vector<int> t(indexes.begin() + i, indexes.begin() + i + x);
102-
res.push_back(t);
90+
int n = groupSizes.size();
91+
vector<vector<int>> g(n + 1);
92+
for (int i = 0; i < n; ++i) g[groupSizes[i]].push_back(i);
93+
vector<vector<int>> ans;
94+
for (int i = 0; i < g.size(); ++i) {
95+
for (int j = 0; j < g[i].size(); j += i) {
96+
vector<int> t(g[i].begin() + j, g[i].begin() + j + i);
97+
ans.push_back(t);
10398
}
10499
}
105-
return res;
100+
return ans;
106101
}
107102
};
108103
```
@@ -111,17 +106,18 @@ public:
111106
112107
```go
113108
func groupThePeople(groupSizes []int) [][]int {
114-
mp := make(map[int][]int)
115-
for i, x := range groupSizes {
116-
mp[x] = append(mp[x], i)
109+
n := len(groupSizes)
110+
g := make([][]int, n+1)
111+
for i, v := range groupSizes {
112+
g[v] = append(g[v], i)
117113
}
118-
var res [][]int
119-
for x, indexes := range mp {
120-
for i := 0; i < len(indexes); i += x {
121-
res = append(res, indexes[i:i+x])
114+
ans := [][]int{}
115+
for i, v := range g {
116+
for j := 0; j < len(v); j += i {
117+
ans = append(ans, v[j:j+i])
122118
}
123119
}
124-
return res
120+
return ans
125121
}
126122
```
127123

Lines changed: 9 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,16 @@
11
class Solution {
22
public:
33
vector<vector<int>> groupThePeople(vector<int>& groupSizes) {
4-
unordered_map<int, vector<int>> mp;
5-
for (int i = 0; i < groupSizes.size(); ++i) mp[groupSizes[i]].push_back(i);
6-
vector<vector<int>> res;
7-
for (auto& entry : mp)
8-
{
9-
int x = entry.first;
10-
auto indexes = entry.second;
11-
for (int i = 0; i < indexes.size(); i += x)
12-
{
13-
vector<int> t(indexes.begin() + i, indexes.begin() + i + x);
14-
res.push_back(t);
4+
int n = groupSizes.size();
5+
vector<vector<int>> g(n + 1);
6+
for (int i = 0; i < n; ++i) g[groupSizes[i]].push_back(i);
7+
vector<vector<int>> ans;
8+
for (int i = 0; i < g.size(); ++i) {
9+
for (int j = 0; j < g[i].size(); j += i) {
10+
vector<int> t(g[i].begin() + j, g[i].begin() + j + i);
11+
ans.push_back(t);
1512
}
1613
}
17-
return res;
14+
return ans;
1815
}
1916
};
Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,14 @@
11
func groupThePeople(groupSizes []int) [][]int {
2-
mp := make(map[int][]int)
3-
for i, x := range groupSizes {
4-
mp[x] = append(mp[x], i)
2+
n := len(groupSizes)
3+
g := make([][]int, n+1)
4+
for i, v := range groupSizes {
5+
g[v] = append(g[v], i)
56
}
6-
var res [][]int
7-
for x, indexes := range mp {
8-
for i := 0; i < len(indexes); i += x {
9-
res = append(res, indexes[i:i+x])
7+
ans := [][]int{}
8+
for i, v := range g {
9+
for j := 0; j < len(v); j += i {
10+
ans = append(ans, v[j:j+i])
1011
}
1112
}
12-
return res
13+
return ans
1314
}
Lines changed: 13 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,20 @@
11
class Solution {
22
public List<List<Integer>> groupThePeople(int[] groupSizes) {
3-
Map<Integer, List<Integer>> mp = new HashMap<>();
4-
for (int i = 0; i < groupSizes.length; ++i) {
5-
mp.computeIfAbsent(groupSizes[i], k -> new ArrayList<>()).add(i);
3+
int n = groupSizes.length;
4+
List<Integer>[] g = new List[n + 1];
5+
for (int i = 0; i < g.length; ++i) {
6+
g[i] = new ArrayList<>();
67
}
7-
List<List<Integer>> res = new ArrayList<>();
8-
for (Map.Entry<Integer, List<Integer>> entry : mp.entrySet()) {
9-
int x = entry.getKey();
10-
List<Integer> indexes = entry.getValue();
11-
for (int i = 0; i < indexes.size(); i += x) {
12-
res.add(new ArrayList<>(indexes.subList(i, i + x)));
8+
for (int i = 0; i < n; ++i) {
9+
g[groupSizes[i]].add(i);
10+
}
11+
List<List<Integer>> ans = new ArrayList<>();
12+
for (int i = 0; i < g.length; ++i) {
13+
List<Integer> v = g[i];
14+
for (int j = 0; j < v.size(); j += i) {
15+
ans.add(v.subList(j, j + i));
1316
}
1417
}
15-
return res;
18+
return ans;
1619
}
1720
}
Lines changed: 4 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,6 @@
11
class Solution:
22
def groupThePeople(self, groupSizes: List[int]) -> List[List[int]]:
3-
mp = defaultdict(list)
4-
for i, x in enumerate(groupSizes):
5-
mp[x].append(i)
6-
res = []
7-
for x, indexes in mp.items():
8-
l = len(indexes)
9-
for i in range(0, l, x):
10-
res.append(indexes[i : i + x])
11-
return res
3+
g = defaultdict(list)
4+
for i, v in enumerate(groupSizes):
5+
g[v].append(i)
6+
return [v[j: j + i] for i, v in g.items() for j in range(0, len(v), i)]

0 commit comments

Comments
 (0)