Given a set of intervals, for each of the interval i, 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.
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. 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.
Note:
- You may assume the interval‘s end point is always bigger than its start point.
- You may assume none of these intervals have the same start point.
Example 1:
Input: [ [1,2] ]
Output: [-1]
Explanation: There is only one interval in the collection, so it outputs -1.
Example 2:
Input: [ [3,4], [2,3], [1,2] ]
Output: [-1, 0, 1]
Explanation: There is no satisfied "right" interval for [3,4].
For [2,3], the interval [3,4] has minimum-"right" start point;
For [1,2], the interval [2,3] has minimum-"right" start point.
Example 3:
Input: [ [1,4], [2,3], [3,4] ]
Output: [-1, 2, -1]
Explanation: There is no satisfied "right" interval for [1,4] and [3,4].
For [2,3], the interval [3,4] has minimum-"right" start point.
Approach #1:
/**
* Definition for an interval.
* struct Interval {
* int start;
* int end;
* Interval() : start(0), end(0) {}
* Interval(int s, int e) : start(s), end(e) {}
* };
*/
class Solution {
public:
vector<int> findRightInterval(vector<Interval>& intervals) {
int len = intervals.size();
vector<int> ans;
map<int, int> temp;
for (int i = 0; i < len; ++i) {
temp[intervals[i].start] = i;
}
for (int i = 0; i < len; ++i) {
auto it = temp.lower_bound(intervals[i].end);
if (it != temp.end()) ans.push_back(it->second);
else ans.push_back(-1);
}
return ans;
}
};
Runtime:
64 ms, faster than 69.43% of C++ online submissions for Find Right Interval.
Analysis:
std::map::lower_bound
iterator lower_bound (const key_type& k);
const_iterator lower_bound (const key_type& k) const;
Return iterator to lower bound
Returns an iterator pointing to the first element in the container whose key is not considered to go before
k (i.e., either it is equivalent or goes after).
The function uses its internal
comparison object (
key_comp) to determine this, returning an iterator to the first element for which
key_comp(element_key,k) would return
false.
If the
map class is instantiated with the default comparison type (
less), the function returns an iterator to the first element whose key is not less than
k.
A similar member function,
upper_bound, has the same behavior as
lower_bound, except in the case that the
mapcontains an element with a key equivalent to
k: In this case,
lower_bound returns an iterator pointing to that element, whereas
upper_bound returns an iterator pointing to the next element.
Parameters
- k
- Key to search for.
Member type key_type is the type of the elements in the container, defined in map as an alias of its first template parameter (Key).
Return value
An iterator to the the first element in the container whose key is not considered to go before
k, or
map::end if all keys are considered to go before
k.
If the
map object is const-qualified, the function returns a
const_iterator. Otherwise, it returns an
iterator.
Member types
iterator and
const_iterator are
bidirectional iterator types pointing to elements (of type
value_type).
Notice that
value_type in
map containers is itself also a
pair type:
pair<const key_type, mapped_type>.
436. Find Right Interval
原文:https://www.cnblogs.com/ruruozhenhao/p/9919028.html