Skip to content

Commit aade7c0

Browse files
committed
feat: add solutions to lc problem: No.0352
No.0352.Data Stream as Disjoint Intervals
1 parent 077f27d commit aade7c0

File tree

7 files changed

+317
-25
lines changed

7 files changed

+317
-25
lines changed

solution/0300-0399/0352.Data Stream as Disjoint Intervals/README.md

Lines changed: 107 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,6 @@
2525
<p><strong>提示:</strong><br>
2626
特别感谢 <a href="https://discuss.leetcode.com/user/yunhong">@yunhong</a> 提供了本问题和其测试用例。</p>
2727

28-
2928
## 解法
3029

3130
<!-- 这里可写通用的实现逻辑 -->
@@ -37,15 +36,121 @@
3736
<!-- 这里可写当前语言的特殊实现逻辑 -->
3837

3938
```python
40-
39+
from sortedcontainers import SortedDict
40+
41+
class SummaryRanges:
42+
43+
def __init__(self):
44+
self.mp = SortedDict()
45+
46+
def addNum(self, val: int) -> None:
47+
n = len(self.mp)
48+
ridx = self.mp.bisect_right(val)
49+
lidx = n if ridx == 0 else ridx - 1
50+
keys = self.mp.keys()
51+
values = self.mp.values()
52+
if lidx != n and ridx != n and values[lidx][1] + 1 == val and values[ridx][0] - 1 == val:
53+
self.mp[keys[lidx]][1] = self.mp[keys[ridx]][1]
54+
self.mp.pop(keys[ridx])
55+
elif lidx != n and val <= values[lidx][1] + 1:
56+
self.mp[keys[lidx]][1] = max(val, self.mp[keys[lidx]][1])
57+
elif ridx != n and val >= values[ridx][0] - 1:
58+
self.mp[keys[ridx]][0] = min(val, self.mp[keys[ridx]][0])
59+
else:
60+
self.mp[val] = [val, val]
61+
62+
def getIntervals(self) -> List[List[int]]:
63+
return list(self.mp.values())
64+
65+
66+
# # Your SummaryRanges object will be instantiated and called as such:
67+
# # obj = SummaryRanges()
68+
# # obj.addNum(val)
69+
# # param_2 = obj.getIntervals()
4170
```
4271

4372
### **Java**
4473

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

4776
```java
77+
class SummaryRanges {
78+
private TreeMap<Integer, int[]> mp;
79+
80+
public SummaryRanges() {
81+
mp = new TreeMap<>();
82+
}
83+
84+
public void addNum(int val) {
85+
Integer l = mp.floorKey(val);
86+
Integer r = mp.ceilingKey(val);
87+
if (l != null && r != null && mp.get(l)[1] + 1 == val && mp.get(r)[0] - 1 == val) {
88+
mp.get(l)[1] = mp.get(r)[1];
89+
mp.remove(r);
90+
} else if (l != null && val <= mp.get(l)[1] + 1) {
91+
mp.get(l)[1] = Math.max(val, mp.get(l)[1]);
92+
} else if (r != null && val >= mp.get(r)[0] - 1) {
93+
mp.get(r)[0] = Math.min(val, mp.get(r)[0]);
94+
} else {
95+
mp.put(val, new int[]{val, val});
96+
}
97+
}
98+
99+
public int[][] getIntervals() {
100+
int[][] res = new int[mp.size()][2];
101+
int i = 0;
102+
for (int[] range : mp.values()) {
103+
res[i++] = range;
104+
}
105+
return res;
106+
}
107+
}
108+
109+
/**
110+
* Your SummaryRanges object will be instantiated and called as such:
111+
* SummaryRanges obj = new SummaryRanges();
112+
* obj.addNum(val);
113+
* int[][] param_2 = obj.getIntervals();
114+
*/
115+
```
48116

117+
### **C++**
118+
119+
```cpp
120+
class SummaryRanges {
121+
private:
122+
map<int, vector<int>> mp;
123+
public:
124+
SummaryRanges() {
125+
126+
}
127+
128+
void addNum(int val) {
129+
auto r = mp.upper_bound(val);
130+
auto l = r == mp.begin() ? mp.end() : prev(r);
131+
if (l != mp.end() && r != mp.end() && l->second[1] + 1 == val && r->second[0] - 1 == val)
132+
{
133+
l->second[1] = r->second[1];
134+
mp.erase(r);
135+
}
136+
else if (l != mp.end() && val <= l->second[1] + 1) l->second[1] = max(val, l->second[1]);
137+
else if (r != mp.end() && val >= r->second[0] - 1) r->second[0] = min(val, r->second[0]);
138+
else mp[val] = {val, val};
139+
}
140+
141+
vector<vector<int>> getIntervals() {
142+
vector<vector<int>> res;
143+
for (auto& range : mp) res.push_back(range.second);
144+
return res;
145+
}
146+
};
147+
148+
/**
149+
* Your SummaryRanges object will be instantiated and called as such:
150+
* SummaryRanges* obj = new SummaryRanges();
151+
* obj->addNum(val);
152+
* vector<vector<int>> param_2 = obj->getIntervals();
153+
*/
49154
```
50155
51156
### **...**

solution/0300-0399/0352.Data Stream as Disjoint Intervals/README_EN.md

Lines changed: 107 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -49,21 +49,126 @@ summaryRanges.getIntervals(); // return [[1, 3], [6, 7]]
4949
<p>&nbsp;</p>
5050
<p><strong>Follow up:</strong> What if there are lots of merges and the number of disjoint intervals is small compared to the size of the data stream?</p>
5151

52-
5352
## Solutions
5453

5554
<!-- tabs:start -->
5655

5756
### **Python3**
5857

5958
```python
60-
59+
from sortedcontainers import SortedDict
60+
61+
class SummaryRanges:
62+
63+
def __init__(self):
64+
self.mp = SortedDict()
65+
66+
def addNum(self, val: int) -> None:
67+
n = len(self.mp)
68+
ridx = self.mp.bisect_right(val)
69+
lidx = n if ridx == 0 else ridx - 1
70+
keys = self.mp.keys()
71+
values = self.mp.values()
72+
if lidx != n and ridx != n and values[lidx][1] + 1 == val and values[ridx][0] - 1 == val:
73+
self.mp[keys[lidx]][1] = self.mp[keys[ridx]][1]
74+
self.mp.pop(keys[ridx])
75+
elif lidx != n and val <= values[lidx][1] + 1:
76+
self.mp[keys[lidx]][1] = max(val, self.mp[keys[lidx]][1])
77+
elif ridx != n and val >= values[ridx][0] - 1:
78+
self.mp[keys[ridx]][0] = min(val, self.mp[keys[ridx]][0])
79+
else:
80+
self.mp[val] = [val, val]
81+
82+
def getIntervals(self) -> List[List[int]]:
83+
return list(self.mp.values())
84+
85+
86+
# # Your SummaryRanges object will be instantiated and called as such:
87+
# # obj = SummaryRanges()
88+
# # obj.addNum(val)
89+
# # param_2 = obj.getIntervals()
6190
```
6291

6392
### **Java**
6493

6594
```java
95+
class SummaryRanges {
96+
private TreeMap<Integer, int[]> mp;
97+
98+
public SummaryRanges() {
99+
mp = new TreeMap<>();
100+
}
101+
102+
public void addNum(int val) {
103+
Integer l = mp.floorKey(val);
104+
Integer r = mp.ceilingKey(val);
105+
if (l != null && r != null && mp.get(l)[1] + 1 == val && mp.get(r)[0] - 1 == val) {
106+
mp.get(l)[1] = mp.get(r)[1];
107+
mp.remove(r);
108+
} else if (l != null && val <= mp.get(l)[1] + 1) {
109+
mp.get(l)[1] = Math.max(val, mp.get(l)[1]);
110+
} else if (r != null && val >= mp.get(r)[0] - 1) {
111+
mp.get(r)[0] = Math.min(val, mp.get(r)[0]);
112+
} else {
113+
mp.put(val, new int[]{val, val});
114+
}
115+
}
116+
117+
public int[][] getIntervals() {
118+
int[][] res = new int[mp.size()][2];
119+
int i = 0;
120+
for (int[] range : mp.values()) {
121+
res[i++] = range;
122+
}
123+
return res;
124+
}
125+
}
126+
127+
/**
128+
* Your SummaryRanges object will be instantiated and called as such:
129+
* SummaryRanges obj = new SummaryRanges();
130+
* obj.addNum(val);
131+
* int[][] param_2 = obj.getIntervals();
132+
*/
133+
```
66134

135+
### **C++**
136+
137+
```cpp
138+
class SummaryRanges {
139+
private:
140+
map<int, vector<int>> mp;
141+
public:
142+
SummaryRanges() {
143+
144+
}
145+
146+
void addNum(int val) {
147+
auto r = mp.upper_bound(val);
148+
auto l = r == mp.begin() ? mp.end() : prev(r);
149+
if (l != mp.end() && r != mp.end() && l->second[1] + 1 == val && r->second[0] - 1 == val)
150+
{
151+
l->second[1] = r->second[1];
152+
mp.erase(r);
153+
}
154+
else if (l != mp.end() && val <= l->second[1] + 1) l->second[1] = max(val, l->second[1]);
155+
else if (r != mp.end() && val >= r->second[0] - 1) r->second[0] = min(val, r->second[0]);
156+
else mp[val] = {val, val};
157+
}
158+
159+
vector<vector<int>> getIntervals() {
160+
vector<vector<int>> res;
161+
for (auto& range : mp) res.push_back(range.second);
162+
return res;
163+
}
164+
};
165+
166+
/**
167+
* Your SummaryRanges object will be instantiated and called as such:
168+
* SummaryRanges* obj = new SummaryRanges();
169+
* obj->addNum(val);
170+
* vector<vector<int>> param_2 = obj->getIntervals();
171+
*/
67172
```
68173
69174
### **...**
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
class SummaryRanges {
2+
private:
3+
map<int, vector<int>> mp;
4+
public:
5+
SummaryRanges() {
6+
7+
}
8+
9+
void addNum(int val) {
10+
auto r = mp.upper_bound(val);
11+
auto l = r == mp.begin() ? mp.end() : prev(r);
12+
if (l != mp.end() && r != mp.end() && l->second[1] + 1 == val && r->second[0] - 1 == val)
13+
{
14+
l->second[1] = r->second[1];
15+
mp.erase(r);
16+
}
17+
else if (l != mp.end() && val <= l->second[1] + 1) l->second[1] = max(val, l->second[1]);
18+
else if (r != mp.end() && val >= r->second[0] - 1) r->second[0] = min(val, r->second[0]);
19+
else mp[val] = {val, val};
20+
}
21+
22+
vector<vector<int>> getIntervals() {
23+
vector<vector<int>> res;
24+
for (auto& range : mp) res.push_back(range.second);
25+
return res;
26+
}
27+
};
28+
29+
/**
30+
* Your SummaryRanges object will be instantiated and called as such:
31+
* SummaryRanges* obj = new SummaryRanges();
32+
* obj->addNum(val);
33+
* vector<vector<int>> param_2 = obj->getIntervals();
34+
*/
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
class SummaryRanges {
2+
private TreeMap<Integer, int[]> mp;
3+
4+
public SummaryRanges() {
5+
mp = new TreeMap<>();
6+
}
7+
8+
public void addNum(int val) {
9+
Integer l = mp.floorKey(val);
10+
Integer r = mp.ceilingKey(val);
11+
if (l != null && r != null && mp.get(l)[1] + 1 == val && mp.get(r)[0] - 1 == val) {
12+
mp.get(l)[1] = mp.get(r)[1];
13+
mp.remove(r);
14+
} else if (l != null && val <= mp.get(l)[1] + 1) {
15+
mp.get(l)[1] = Math.max(val, mp.get(l)[1]);
16+
} else if (r != null && val >= mp.get(r)[0] - 1) {
17+
mp.get(r)[0] = Math.min(val, mp.get(r)[0]);
18+
} else {
19+
mp.put(val, new int[]{val, val});
20+
}
21+
}
22+
23+
public int[][] getIntervals() {
24+
int[][] res = new int[mp.size()][2];
25+
int i = 0;
26+
for (int[] range : mp.values()) {
27+
res[i++] = range;
28+
}
29+
return res;
30+
}
31+
}
32+
33+
/**
34+
* Your SummaryRanges object will be instantiated and called as such:
35+
* SummaryRanges obj = new SummaryRanges();
36+
* obj.addNum(val);
37+
* int[][] param_2 = obj.getIntervals();
38+
*/
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
from sortedcontainers import SortedDict
2+
3+
class SummaryRanges:
4+
5+
def __init__(self):
6+
self.mp = SortedDict()
7+
8+
def addNum(self, val: int) -> None:
9+
n = len(self.mp)
10+
ridx = self.mp.bisect_right(val)
11+
lidx = n if ridx == 0 else ridx - 1
12+
keys = self.mp.keys()
13+
values = self.mp.values()
14+
if lidx != n and ridx != n and values[lidx][1] + 1 == val and values[ridx][0] - 1 == val:
15+
self.mp[keys[lidx]][1] = self.mp[keys[ridx]][1]
16+
self.mp.pop(keys[ridx])
17+
elif lidx != n and val <= values[lidx][1] + 1:
18+
self.mp[keys[lidx]][1] = max(val, self.mp[keys[lidx]][1])
19+
elif ridx != n and val >= values[ridx][0] - 1:
20+
self.mp[keys[ridx]][0] = min(val, self.mp[keys[ridx]][0])
21+
else:
22+
self.mp[val] = [val, val]
23+
24+
def getIntervals(self) -> List[List[int]]:
25+
return list(self.mp.values())
26+
27+
28+
# # Your SummaryRanges object will be instantiated and called as such:
29+
# # obj = SummaryRanges()
30+
# # obj.addNum(val)
31+
# # param_2 = obj.getIntervals()

solution/0500-0599/0542.01 Matrix/README.md

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,6 @@
5050
<li>矩阵中的元素只在四个方向上相邻: 上、下、左、右。</li>
5151
</ul>
5252

53-
5453
## 解法
5554

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

0 commit comments

Comments
 (0)