Skip to content

Commit 8618831

Browse files
author
freemanzhang
committed
init impl
1 parent b1f357e commit 8618831

File tree

1 file changed

+167
-0
lines changed

1 file changed

+167
-0
lines changed
Lines changed: 167 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,167 @@
1+
package interval;
2+
3+
import java.util.ArrayList;
4+
import java.util.Arrays;
5+
import java.util.Collections;
6+
import java.util.HashMap;
7+
import java.util.List;
8+
import java.util.Map;
9+
import java.util.TreeMap;
10+
11+
import utility.Interval;
12+
13+
/*
14+
Given a set of intervals, for each of the interval i,
15+
check if there exists an interval j whose start point is bigger than or equal to the end point of the interval i, which can be called that j is on the "right" of i.
16+
17+
For any interval i, you need to store the minimum interval j's index, which means that the interval j has the minimum start point to build the "right" relationship for interval i.
18+
If the interval j doesn't exist, store -1 for the interval i. Finally, you need output the stored value of each interval as an array.
19+
20+
Note:
21+
You may assume the interval's end point is always bigger than its start point.
22+
You may assume none of these intervals have the same start point.
23+
24+
Example 1:
25+
Input: [ [1,2] ]
26+
Output: [-1]
27+
Explanation: There is only one interval in the collection, so it outputs -1.
28+
29+
Example 2:
30+
Input: [ [3,4], [2,3], [1,2] ]
31+
Output: [-1, 0, 1]
32+
Explanation: There is no satisfied "right" interval for [3,4].
33+
For [2,3], the interval [3,4] has minimum-"right" start point;
34+
For [1,2], the interval [2,3] has minimum-"right" start point.
35+
36+
Example 3:
37+
Input: [ [1,4], [2,3], [3,4] ]
38+
Output: [-1, 2, -1]
39+
Explanation: There is no satisfied "right" interval for [1,4] and [3,4].
40+
For [2,3], the interval [3,4] has minimum-"right" start point.
41+
*/
42+
43+
public class FindRightInterval
44+
{
45+
class Point implements Comparable<Point>
46+
{
47+
int val;
48+
int flag; // 1 start, 0 end
49+
int index;
50+
51+
public Point(int val, int flag, int index) {
52+
this.val = val;
53+
this.flag = flag;
54+
this.index = index;
55+
}
56+
57+
public int compareTo( Point o )
58+
{
59+
if ( this.val == o.val )
60+
return this.flag - o.flag; // end in front of start
61+
return this.val - o.val;
62+
}
63+
}
64+
65+
public int[] findRightInterval( Interval[] intervals )
66+
{
67+
if ( intervals == null || intervals.length == 0 )
68+
return new int[] {};
69+
70+
int[] res = new int[intervals.length];
71+
Arrays.fill( res, -1 );
72+
73+
List<Point> points = new ArrayList<>();
74+
for ( int i = 0; i < intervals.length; i++ )
75+
{
76+
points.add( new Point( intervals[i].start, 1, i ) );
77+
points.add( new Point( intervals[i].end, 0, i ) );
78+
}
79+
80+
Collections.sort( points );
81+
82+
List<Integer> prevIdxs = new ArrayList<>();
83+
84+
for ( Point point : points )
85+
{
86+
if ( point.flag == 1 )
87+
{
88+
for ( Integer prevIdx : prevIdxs )
89+
{
90+
res[prevIdx] = point.index;
91+
}
92+
prevIdxs = new ArrayList<>();
93+
}
94+
else
95+
{
96+
prevIdxs.add( point.index );
97+
}
98+
}
99+
100+
return res;
101+
}
102+
103+
public int[] findRightIntervalTreeMap( Interval[] intervals )
104+
{
105+
int[] result = new int[intervals.length];
106+
java.util.NavigableMap<Integer, Integer> intervalMap = new TreeMap<>();
107+
108+
for ( int i = 0; i < intervals.length; ++i )
109+
{
110+
intervalMap.put( intervals[i].start, i );
111+
}
112+
113+
for ( int i = 0; i < intervals.length; ++i )
114+
{
115+
Map.Entry<Integer, Integer> entry = intervalMap.ceilingEntry( intervals[i].end );
116+
result[i] = ( entry != null ) ? entry.getValue() : -1;
117+
}
118+
119+
return result;
120+
}
121+
122+
public int[] findRightIntervalBinarySearch( Interval[] intervals )
123+
{
124+
Map<Integer, Integer> map = new HashMap<>();
125+
List<Integer> starts = new ArrayList<>();
126+
for ( int i = 0; i < intervals.length; i++ )
127+
{
128+
map.put( intervals[i].start, i );
129+
starts.add( intervals[i].start );
130+
}
131+
132+
Collections.sort( starts );
133+
int[] res = new int[intervals.length];
134+
for ( int i = 0; i < intervals.length; i++ )
135+
{
136+
int end = intervals[i].end;
137+
int start = binarySearch( starts, end );
138+
if ( start < end )
139+
{
140+
res[i] = -1;
141+
}
142+
else
143+
{
144+
res[i] = map.get( start );
145+
}
146+
}
147+
return res;
148+
}
149+
150+
private int binarySearch( List<Integer> list, int x )
151+
{
152+
int left = 0, right = list.size() - 1;
153+
while ( left < right )
154+
{
155+
int mid = left + ( right - left ) / 2;
156+
if ( list.get( mid ) < x )
157+
{
158+
left = mid + 1;
159+
}
160+
else
161+
{
162+
right = mid;
163+
}
164+
}
165+
return list.get( left );
166+
}
167+
}

0 commit comments

Comments
 (0)