Kaidul

Untitled

Oct 31st, 2016
108
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.81 KB | None | 0 0
  1. /**
  2.  * Definition for an interval.
  3.  * struct Interval {
  4.  *     int start;
  5.  *     int end;
  6.  *     Interval() : start(0), end(0) {}
  7.  *     Interval(int s, int e) : start(s), end(e) {}
  8.  * };
  9.  */
  10. class Solution {
  11.     template <class T>
  12.     inline void hash_combine(std::size_t & seed, const T & v)
  13.     {
  14.       std::hash<T> hasher;
  15.       seed ^= hasher(v) + 0x9e3779b9 + (seed << 6) + (seed >> 2);
  16.     }
  17.      
  18.     namespace std
  19.     {
  20.       template<typename S, typename T> struct hash<pair<S, T>>
  21.       {
  22.         inline size_t operator()(const pair<S, T> & v) const
  23.         {
  24.           size_t seed = 0;
  25.           ::hash_combine(seed, v.first);
  26.           ::hash_combine(seed, v.second);
  27.           return seed;
  28.         }
  29.       };
  30.     }
  31.  
  32. public:
  33.     vector<int> findRightInterval(vector<Interval>& intervals) {
  34.         int n = intervals.size();
  35.         vector<int> result(n);
  36.         unordered_map<pair<int, int>, int> indxMap;
  37.         for(int i = 0; i < n; ++i) {
  38.             indxMap[{intervals[i].start, intervals[i].end}] = i;
  39.         }
  40.         auto compare = [](Interval const& lhs, Interval const& rhs) {
  41.             return lhs.start < rhs.start;
  42.         };
  43.         sort(intervals.begin(), intervals.end(), compare);
  44.         for(int i = 0; i < n; ++i) {
  45.             int k = i + 1;
  46.             bool found = false;
  47.             while(k < n) {
  48.                 if(intervals[k].start >= intervals[i].end) {
  49.                     result[indxMap[{intervals[i].start, intervals[i].end}]] = indxMap[{intervals[k].start, intervals[k].end}];
  50.                     found = true;
  51.                     break;
  52.                 }
  53.                 ++k;
  54.             }
  55.             if(!found) {
  56.                 result[indxMap[{intervals[i].start, intervals[i].end}]] = -1;
  57.             }
  58.         }
  59.         return result;
  60.     }
  61. };
Advertisement
Add Comment
Please, Sign In to add comment