Skip to content

Commit f4dbfeb

Browse files
committed
feat: add solutions to lc problems: No.0846,1296
No.0846.Hand of Straights No.1296.Divide Array in Sets of K Consecutive Numbers
1 parent 19dedc5 commit f4dbfeb

File tree

12 files changed

+518
-76
lines changed

12 files changed

+518
-76
lines changed

solution/0800-0899/0846.Hand of Straights/README.md

Lines changed: 91 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -49,14 +49,38 @@
4949

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

52+
TreeMap 实现。
53+
5254
<!-- tabs:start -->
5355

5456
### **Python3**
5557

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

5860
```python
59-
61+
from sortedcontainers import SortedDict
62+
63+
64+
class Solution:
65+
def isNStraightHand(self, hand: List[int], groupSize: int) -> bool:
66+
if len(hand) % groupSize != 0:
67+
return False
68+
sd = SortedDict()
69+
for h in hand:
70+
if h in sd:
71+
sd[h] += 1
72+
else:
73+
sd[h] = 1
74+
while sd:
75+
v = sd.peekitem(0)[0]
76+
for i in range(v, v + groupSize):
77+
if i not in sd:
78+
return False
79+
if sd[i] == 1:
80+
sd.pop(i)
81+
else:
82+
sd[i] -= 1
83+
return True
6084
```
6185

6286
### **Java**
@@ -69,22 +93,20 @@ class Solution {
6993
if (hand.length % groupSize != 0) {
7094
return false;
7195
}
72-
TreeMap<Integer, Integer> mp = new TreeMap<>();
73-
for (int item : hand) {
74-
mp.put(item, mp.getOrDefault(item, 0) + 1);
96+
TreeMap<Integer, Integer> tm = new TreeMap<>();
97+
for (int h : hand) {
98+
tm.put(h, tm.getOrDefault(h, 0) + 1);
7599
}
76-
77-
while (mp.size() > 0) {
78-
int start = mp.firstKey();
79-
for (int i = start; i < start + groupSize; i++) {
80-
if (!mp.containsKey(i)) {
100+
while (!tm.isEmpty()) {
101+
int v = tm.firstKey();
102+
for (int i = v; i < v + groupSize; ++i) {
103+
if (!tm.containsKey(i)) {
81104
return false;
82105
}
83-
int time = mp.get(i);
84-
if (time == 1) {
85-
mp.remove(i);
106+
if (tm.get(i) == 1) {
107+
tm.remove(i);
86108
} else {
87-
mp.replace(i, time - 1);
109+
tm.put(i, tm.get(i) - 1);
88110
}
89111
}
90112
}
@@ -93,6 +115,62 @@ class Solution {
93115
}
94116
```
95117

118+
### **C++**
119+
120+
```cpp
121+
class Solution {
122+
public:
123+
bool isNStraightHand(vector<int>& hand, int groupSize) {
124+
if (hand.size() % groupSize != 0) return false;
125+
map<int, int> mp;
126+
for (int& h : hand) mp[h] += 1;
127+
while (!mp.empty())
128+
{
129+
int v = mp.begin()->first;
130+
for (int i = v; i < v + groupSize; ++i)
131+
{
132+
if (!mp.count(i)) return false;
133+
if (mp[i] == 1) mp.erase(i);
134+
else mp[i] -= 1;
135+
}
136+
}
137+
return true;
138+
}
139+
};
140+
```
141+
142+
### **Go**
143+
144+
```go
145+
func isNStraightHand(hand []int, groupSize int) bool {
146+
if len(hand)%groupSize != 0 {
147+
return false
148+
}
149+
m := treemap.NewWithIntComparator()
150+
for _, h := range hand {
151+
if v, ok := m.Get(h); ok {
152+
m.Put(h, v.(int)+1)
153+
} else {
154+
m.Put(h, 1)
155+
}
156+
}
157+
for !m.Empty() {
158+
v, _ := m.Min()
159+
for i := v.(int); i < v.(int)+groupSize; i++ {
160+
if _, ok := m.Get(i); !ok {
161+
return false
162+
}
163+
if v, _ := m.Get(i); v.(int) == 1 {
164+
m.Remove(i)
165+
} else {
166+
m.Put(i, v.(int)-1)
167+
}
168+
}
169+
}
170+
return true
171+
}
172+
```
173+
96174
### **...**
97175

98176
```

solution/0800-0899/0846.Hand of Straights/README_EN.md

Lines changed: 89 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,29 @@
4646
### **Python3**
4747

4848
```python
49-
49+
from sortedcontainers import SortedDict
50+
51+
52+
class Solution:
53+
def isNStraightHand(self, hand: List[int], groupSize: int) -> bool:
54+
if len(hand) % groupSize != 0:
55+
return False
56+
sd = SortedDict()
57+
for h in hand:
58+
if h in sd:
59+
sd[h] += 1
60+
else:
61+
sd[h] = 1
62+
while sd:
63+
v = sd.peekitem(0)[0]
64+
for i in range(v, v + groupSize):
65+
if i not in sd:
66+
return False
67+
if sd[i] == 1:
68+
sd.pop(i)
69+
else:
70+
sd[i] -= 1
71+
return True
5072
```
5173

5274
### **Java**
@@ -57,22 +79,20 @@ class Solution {
5779
if (hand.length % groupSize != 0) {
5880
return false;
5981
}
60-
TreeMap<Integer, Integer> mp = new TreeMap<>();
61-
for (int item : hand) {
62-
mp.put(item, mp.getOrDefault(item, 0) + 1);
82+
TreeMap<Integer, Integer> tm = new TreeMap<>();
83+
for (int h : hand) {
84+
tm.put(h, tm.getOrDefault(h, 0) + 1);
6385
}
64-
65-
while (mp.size() > 0) {
66-
int start = mp.firstKey();
67-
for (int i = start; i < start + groupSize; i++) {
68-
if (!mp.containsKey(i)) {
86+
while (!tm.isEmpty()) {
87+
int v = tm.firstKey();
88+
for (int i = v; i < v + groupSize; ++i) {
89+
if (!tm.containsKey(i)) {
6990
return false;
7091
}
71-
int time = mp.get(i);
72-
if (time == 1) {
73-
mp.remove(i);
92+
if (tm.get(i) == 1) {
93+
tm.remove(i);
7494
} else {
75-
mp.replace(i, time - 1);
95+
tm.put(i, tm.get(i) - 1);
7696
}
7797
}
7898
}
@@ -81,6 +101,62 @@ class Solution {
81101
}
82102
```
83103

104+
### **C++**
105+
106+
```cpp
107+
class Solution {
108+
public:
109+
bool isNStraightHand(vector<int>& hand, int groupSize) {
110+
if (hand.size() % groupSize != 0) return false;
111+
map<int, int> mp;
112+
for (int& h : hand) mp[h] += 1;
113+
while (!mp.empty())
114+
{
115+
int v = mp.begin()->first;
116+
for (int i = v; i < v + groupSize; ++i)
117+
{
118+
if (!mp.count(i)) return false;
119+
if (mp[i] == 1) mp.erase(i);
120+
else mp[i] -= 1;
121+
}
122+
}
123+
return true;
124+
}
125+
};
126+
```
127+
128+
### **Go**
129+
130+
```go
131+
func isNStraightHand(hand []int, groupSize int) bool {
132+
if len(hand)%groupSize != 0 {
133+
return false
134+
}
135+
m := treemap.NewWithIntComparator()
136+
for _, h := range hand {
137+
if v, ok := m.Get(h); ok {
138+
m.Put(h, v.(int)+1)
139+
} else {
140+
m.Put(h, 1)
141+
}
142+
}
143+
for !m.Empty() {
144+
v, _ := m.Min()
145+
for i := v.(int); i < v.(int)+groupSize; i++ {
146+
if _, ok := m.Get(i); !ok {
147+
return false
148+
}
149+
if v, _ := m.Get(i); v.(int) == 1 {
150+
m.Remove(i)
151+
} else {
152+
m.Put(i, v.(int)-1)
153+
}
154+
}
155+
}
156+
return true
157+
}
158+
```
159+
84160
### **...**
85161

86162
```
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
class Solution {
2+
public:
3+
bool isNStraightHand(vector<int>& hand, int groupSize) {
4+
if (hand.size() % groupSize != 0) return false;
5+
map<int, int> mp;
6+
for (int& h : hand) mp[h] += 1;
7+
while (!mp.empty())
8+
{
9+
int v = mp.begin()->first;
10+
for (int i = v; i < v + groupSize; ++i)
11+
{
12+
if (!mp.count(i)) return false;
13+
if (mp[i] == 1) mp.erase(i);
14+
else mp[i] -= 1;
15+
}
16+
}
17+
return true;
18+
}
19+
};
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
func isNStraightHand(hand []int, groupSize int) bool {
2+
if len(hand)%groupSize != 0 {
3+
return false
4+
}
5+
m := treemap.NewWithIntComparator()
6+
for _, h := range hand {
7+
if v, ok := m.Get(h); ok {
8+
m.Put(h, v.(int)+1)
9+
} else {
10+
m.Put(h, 1)
11+
}
12+
}
13+
for !m.Empty() {
14+
v, _ := m.Min()
15+
for i := v.(int); i < v.(int)+groupSize; i++ {
16+
if _, ok := m.Get(i); !ok {
17+
return false
18+
}
19+
if v, _ := m.Get(i); v.(int) == 1 {
20+
m.Remove(i)
21+
} else {
22+
m.Put(i, v.(int)-1)
23+
}
24+
}
25+
}
26+
return true
27+
}

solution/0800-0899/0846.Hand of Straights/Solution.java

Lines changed: 10 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -3,22 +3,20 @@ public boolean isNStraightHand(int[] hand, int groupSize) {
33
if (hand.length % groupSize != 0) {
44
return false;
55
}
6-
TreeMap<Integer, Integer> mp = new TreeMap<>();
7-
for (int item : hand) {
8-
mp.put(item, mp.getOrDefault(item, 0) + 1);
6+
TreeMap<Integer, Integer> tm = new TreeMap<>();
7+
for (int h : hand) {
8+
tm.put(h, tm.getOrDefault(h, 0) + 1);
99
}
10-
11-
while (mp.size() > 0) {
12-
int start = mp.firstKey();
13-
for (int i = start; i < start + groupSize; i++) {
14-
if (!mp.containsKey(i)) {
10+
while (!tm.isEmpty()) {
11+
int v = tm.firstKey();
12+
for (int i = v; i < v + groupSize; ++i) {
13+
if (!tm.containsKey(i)) {
1514
return false;
1615
}
17-
int time = mp.get(i);
18-
if (time == 1) {
19-
mp.remove(i);
16+
if (tm.get(i) == 1) {
17+
tm.remove(i);
2018
} else {
21-
mp.replace(i, time - 1);
19+
tm.put(i, tm.get(i) - 1);
2220
}
2321
}
2422
}
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
from sortedcontainers import SortedDict
2+
3+
4+
class Solution:
5+
def isNStraightHand(self, hand: List[int], groupSize: int) -> bool:
6+
if len(hand) % groupSize != 0:
7+
return False
8+
sd = SortedDict()
9+
for h in hand:
10+
if h in sd:
11+
sd[h] += 1
12+
else:
13+
sd[h] = 1
14+
while sd:
15+
v = sd.peekitem(0)[0]
16+
for i in range(v, v + groupSize):
17+
if i not in sd:
18+
return False
19+
if sd[i] == 1:
20+
sd.pop(i)
21+
else:
22+
sd[i] -= 1
23+
return True

0 commit comments

Comments
 (0)