Skip to content

Commit 35ef049

Browse files
committedAug 7, 2021
feat: add solutions to lc problem: No.0436.Find Right Interval
1 parent 89b7ad3 commit 35ef049

File tree

6 files changed

+307
-4
lines changed

6 files changed

+307
-4
lines changed
 

‎solution/0400-0499/0436.Find Right Interval/README.md

+106-2
Original file line numberDiff line numberDiff line change
@@ -51,27 +51,131 @@
5151
<li>每个间隔的起点都 <strong>不相同</strong></li>
5252
</ul>
5353

54-
5554
## 解法
5655

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

58+
二分查找。
59+
5960
<!-- tabs:start -->
6061

6162
### **Python3**
6263

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

6566
```python
66-
67+
class Solution:
68+
def findRightInterval(self, intervals: List[List[int]]) -> List[int]:
69+
n = len(intervals)
70+
starts = [(intervals[i][0], i) for i in range(n)]
71+
starts.sort(key=lambda x : x[0])
72+
res = []
73+
for _, end in intervals:
74+
left, right = 0, n - 1
75+
while left < right:
76+
mid = (left + right) >> 1
77+
if starts[mid][0] >= end:
78+
right = mid
79+
else:
80+
left = mid + 1
81+
res.append(-1 if starts[left][0] < end else starts[left][1])
82+
return res
6783
```
6884

6985
### **Java**
7086

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

7389
```java
90+
class Solution {
91+
public int[] findRightInterval(int[][] intervals) {
92+
int n = intervals.length;
93+
List<int[]> starts = new ArrayList<>();
94+
for (int i = 0; i < n; ++i) {
95+
starts.add(new int[]{intervals[i][0], i});
96+
}
97+
starts.sort(Comparator.comparingInt(a -> a[0]));
98+
int[] res = new int[n];
99+
int i = 0;
100+
for (int[] interval : intervals) {
101+
int left = 0, right = n - 1;
102+
int end = interval[1];
103+
while (left < right) {
104+
int mid = (left + right) >> 1;
105+
if (starts.get(mid)[0] >= end) {
106+
right = mid;
107+
} else {
108+
left = mid + 1;
109+
}
110+
}
111+
res[i++] = starts.get(left)[0] < end ? -1 : starts.get(left)[1];
112+
}
113+
return res;
114+
}
115+
}
116+
```
117+
118+
### **C++**
119+
120+
```cpp
121+
class Solution {
122+
public:
123+
vector<int> findRightInterval(vector<vector<int>>& intervals) {
124+
int n = intervals.size();
125+
vector<pair<int, int>> starts;
126+
for (int i = 0; i < n; ++i) {
127+
starts.emplace_back(make_pair(intervals[i][0], i));
128+
}
129+
sort(starts.begin(), starts.end());
130+
vector<int> res;
131+
for (auto interval : intervals) {
132+
int left = 0, right = n - 1;
133+
int end = interval[1];
134+
while (left < right) {
135+
int mid = left + right >> 1;
136+
if (starts[mid].first >= end) right = mid;
137+
else left = mid + 1;
138+
}
139+
res.push_back(starts[left].first < end ? -1 : starts[left].second);
140+
}
141+
return res;
142+
}
143+
};
144+
```
74145
146+
### **Go**
147+
148+
```go
149+
func findRightInterval(intervals [][]int) []int {
150+
n := len(intervals)
151+
starts := make([][]int, n)
152+
for i := 0; i < n; i++ {
153+
starts[i] = make([]int, 2)
154+
starts[i][0] = intervals[i][0]
155+
starts[i][1] = i
156+
}
157+
sort.Slice(starts, func(i, j int) bool {
158+
return starts[i][0] < starts[j][0]
159+
})
160+
var res []int
161+
for _, interval := range intervals {
162+
left, right, end := 0, n-1, interval[1]
163+
for left < right {
164+
mid := (left + right) >> 1
165+
if starts[mid][0] >= end {
166+
right = mid
167+
} else {
168+
left = mid + 1
169+
}
170+
}
171+
val := -1
172+
if starts[left][0] >= end {
173+
val = starts[left][1]
174+
}
175+
res = append(res, val)
176+
}
177+
return res
178+
}
75179
```
76180

77181
### **...**

‎solution/0400-0499/0436.Find Right Interval/README_EN.md

+106-2
Original file line numberDiff line numberDiff line change
@@ -48,21 +48,125 @@ The right interval for [2,3] is [3,4] since start<sub>2</sub> = 3 is the smalles
4848
<li>The start point&nbsp;of each interval is <strong>unique</strong>.</li>
4949
</ul>
5050

51-
5251
## Solutions
5352

53+
Binary search.
54+
5455
<!-- tabs:start -->
5556

5657
### **Python3**
5758

5859
```python
59-
60+
class Solution:
61+
def findRightInterval(self, intervals: List[List[int]]) -> List[int]:
62+
n = len(intervals)
63+
starts = [(intervals[i][0], i) for i in range(n)]
64+
starts.sort(key=lambda x : x[0])
65+
res = []
66+
for _, end in intervals:
67+
left, right = 0, n - 1
68+
while left < right:
69+
mid = (left + right) >> 1
70+
if starts[mid][0] >= end:
71+
right = mid
72+
else:
73+
left = mid + 1
74+
res.append(-1 if starts[left][0] < end else starts[left][1])
75+
return res
6076
```
6177

6278
### **Java**
6379

6480
```java
81+
class Solution {
82+
public int[] findRightInterval(int[][] intervals) {
83+
int n = intervals.length;
84+
List<int[]> starts = new ArrayList<>();
85+
for (int i = 0; i < n; ++i) {
86+
starts.add(new int[]{intervals[i][0], i});
87+
}
88+
starts.sort(Comparator.comparingInt(a -> a[0]));
89+
int[] res = new int[n];
90+
int i = 0;
91+
for (int[] interval : intervals) {
92+
int left = 0, right = n - 1;
93+
int end = interval[1];
94+
while (left < right) {
95+
int mid = (left + right) >> 1;
96+
if (starts.get(mid)[0] >= end) {
97+
right = mid;
98+
} else {
99+
left = mid + 1;
100+
}
101+
}
102+
res[i++] = starts.get(left)[0] < end ? -1 : starts.get(left)[1];
103+
}
104+
return res;
105+
}
106+
}
107+
```
108+
109+
### **C++**
110+
111+
```cpp
112+
class Solution {
113+
public:
114+
vector<int> findRightInterval(vector<vector<int>>& intervals) {
115+
int n = intervals.size();
116+
vector<pair<int, int>> starts;
117+
for (int i = 0; i < n; ++i) {
118+
starts.emplace_back(make_pair(intervals[i][0], i));
119+
}
120+
sort(starts.begin(), starts.end());
121+
vector<int> res;
122+
for (auto interval : intervals) {
123+
int left = 0, right = n - 1;
124+
int end = interval[1];
125+
while (left < right) {
126+
int mid = left + right >> 1;
127+
if (starts[mid].first >= end) right = mid;
128+
else left = mid + 1;
129+
}
130+
res.push_back(starts[left].first < end ? -1 : starts[left].second);
131+
}
132+
return res;
133+
}
134+
};
135+
```
65136
137+
### **Go**
138+
139+
```go
140+
func findRightInterval(intervals [][]int) []int {
141+
n := len(intervals)
142+
starts := make([][]int, n)
143+
for i := 0; i < n; i++ {
144+
starts[i] = make([]int, 2)
145+
starts[i][0] = intervals[i][0]
146+
starts[i][1] = i
147+
}
148+
sort.Slice(starts, func(i, j int) bool {
149+
return starts[i][0] < starts[j][0]
150+
})
151+
var res []int
152+
for _, interval := range intervals {
153+
left, right, end := 0, n-1, interval[1]
154+
for left < right {
155+
mid := (left + right) >> 1
156+
if starts[mid][0] >= end {
157+
right = mid
158+
} else {
159+
left = mid + 1
160+
}
161+
}
162+
val := -1
163+
if starts[left][0] >= end {
164+
val = starts[left][1]
165+
}
166+
res = append(res, val)
167+
}
168+
return res
169+
}
66170
```
67171

68172
### **...**
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
class Solution {
2+
public:
3+
vector<int> findRightInterval(vector<vector<int>>& intervals) {
4+
int n = intervals.size();
5+
vector<pair<int, int>> starts;
6+
for (int i = 0; i < n; ++i) {
7+
starts.emplace_back(make_pair(intervals[i][0], i));
8+
}
9+
sort(starts.begin(), starts.end());
10+
vector<int> res;
11+
for (auto interval : intervals) {
12+
int left = 0, right = n - 1;
13+
int end = interval[1];
14+
while (left < right) {
15+
int mid = left + right >> 1;
16+
if (starts[mid].first >= end) right = mid;
17+
else left = mid + 1;
18+
}
19+
res.push_back(starts[left].first < end ? -1 : starts[left].second);
20+
}
21+
return res;
22+
}
23+
};
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
func findRightInterval(intervals [][]int) []int {
2+
n := len(intervals)
3+
starts := make([][]int, n)
4+
for i := 0; i < n; i++ {
5+
starts[i] = make([]int, 2)
6+
starts[i][0] = intervals[i][0]
7+
starts[i][1] = i
8+
}
9+
sort.Slice(starts, func(i, j int) bool {
10+
return starts[i][0] < starts[j][0]
11+
})
12+
var res []int
13+
for _, interval := range intervals {
14+
left, right, end := 0, n-1, interval[1]
15+
for left < right {
16+
mid := (left + right) >> 1
17+
if starts[mid][0] >= end {
18+
right = mid
19+
} else {
20+
left = mid + 1
21+
}
22+
}
23+
val := -1
24+
if starts[left][0] >= end {
25+
val = starts[left][1]
26+
}
27+
res = append(res, val)
28+
}
29+
return res
30+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
class Solution {
2+
public int[] findRightInterval(int[][] intervals) {
3+
int n = intervals.length;
4+
List<int[]> starts = new ArrayList<>();
5+
for (int i = 0; i < n; ++i) {
6+
starts.add(new int[]{intervals[i][0], i});
7+
}
8+
starts.sort(Comparator.comparingInt(a -> a[0]));
9+
int[] res = new int[n];
10+
int i = 0;
11+
for (int[] interval : intervals) {
12+
int left = 0, right = n - 1;
13+
int end = interval[1];
14+
while (left < right) {
15+
int mid = (left + right) >> 1;
16+
if (starts.get(mid)[0] >= end) {
17+
right = mid;
18+
} else {
19+
left = mid + 1;
20+
}
21+
}
22+
res[i++] = starts.get(left)[0] < end ? -1 : starts.get(left)[1];
23+
}
24+
return res;
25+
}
26+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
class Solution:
2+
def findRightInterval(self, intervals: List[List[int]]) -> List[int]:
3+
n = len(intervals)
4+
starts = [(intervals[i][0], i) for i in range(n)]
5+
starts.sort(key=lambda x : x[0])
6+
res = []
7+
for _, end in intervals:
8+
left, right = 0, n - 1
9+
while left < right:
10+
mid = (left + right) >> 1
11+
if starts[mid][0] >= end:
12+
right = mid
13+
else:
14+
left = mid + 1
15+
res.append(-1 if starts[left][0] < end else starts[left][1])
16+
return res

0 commit comments

Comments
 (0)