@@ -48,21 +48,125 @@ The right interval for [2,3] is [3,4] since start<sub>2</sub> = 3 is the smalles
48
48
<li>The start point of each interval is <strong>unique</strong>.</li>
49
49
</ul >
50
50
51
-
52
51
## Solutions
53
52
53
+ Binary search.
54
+
54
55
<!-- tabs:start -->
55
56
56
57
### ** Python3**
57
58
58
59
``` 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
60
76
```
61
77
62
78
### ** Java**
63
79
64
80
``` 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
+ ```
65
136
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
+ }
66
170
```
67
171
68
172
### ** ...**
0 commit comments