774. Minimize Max Distance to Gas Station | NOEY



774. Minimize Max Distance to Gas Station | NOEY

题意为:给定一些坐标点,表示坐标轴上已有的gas sta­tion,同时给定K,表示将要再插入K个gas sta­tion,插完以后使gas sta­tion之间的最大距离最小。

首先要从离散的点抽象出In­ter­val的概念,其实已有的gas sta­tion就是一个个In­ter­val。更为关键的是,这些in­ter­val可以视为永远不变,唯一变化的就是他们里边可能插入多少个K。基于这些in­ter­val,我们每次选择插入K的时候,只要选择插入当前所有in­ter­val中dist最大的那个,一直插入直到它比第二大小为止。插完所有的K,我们就得到了最后的解。

有了以上的理解,一个pri­or­ity_queue就可以轻易的解决问题,用addK()去up­date当前in­ter­val里的value,然后把up­date完的top重新插回pri­or­ity_queue。解法复杂度为O(klogn)

1  2  3  4  5  6  7  8  9  10  11  12  13  14  15  16  17  18  19  20  21  22  23  24  25  26  27  28  29  30  31  32  33  34  35  36  37  38  39  
struct Interval {      int length, k, dist;        Interval(int i) : length(i), k(1), dist(i) {}        bool operator< (const Interval& other) const {          return dist < other.dist;      }        void addK() {          k++;          dist = length/k;      }  };    priority_queue<Interval> buildQueue(const vector<int>& v) {      vector<int> ret(v.size());      adjacent_difference(v.begin(), v.end(), ret.begin());      ret.erase(ret.begin());      return priority_queue<Interval>(ret.begin(), ret.end());  }    int minMaxDist(const vector<int>& v, int k) {      auto pq = buildQueue(v);      int maxDist = (v.back() - v.front())/(k+1); // just for optimization        while(k) {          Interval top = pq.top();          pq.pop();            while(pq.top() < top || top.dist > maxDist) {              top.addK();              k--;          }          pq.push(top);      }        return pq.top().dist;  }  

这题的难点在于正确理解题意并抽象化后找出算法,关键点在于:

  • 由于最早给定的gas station,随着K的插入,变化的并不是interval,而是每个interval内部的dist。
  • 只关注最后的最大距离,并不关心每个gas station插在了哪里

Read full article from 774. Minimize Max Distance to Gas Station | NOEY


No comments:

Post a Comment

Labels

Algorithm (219) Lucene (130) LeetCode (97) Database (36) Data Structure (33) text mining (28) Solr (27) java (27) Mathematical Algorithm (26) Difficult Algorithm (25) Logic Thinking (23) Puzzles (23) Bit Algorithms (22) Math (21) List (20) Dynamic Programming (19) Linux (19) Tree (18) Machine Learning (15) EPI (11) Queue (11) Smart Algorithm (11) Operating System (9) Java Basic (8) Recursive Algorithm (8) Stack (8) Eclipse (7) Scala (7) Tika (7) J2EE (6) Monitoring (6) Trie (6) Concurrency (5) Geometry Algorithm (5) Greedy Algorithm (5) Mahout (5) MySQL (5) xpost (5) C (4) Interview (4) Vi (4) regular expression (4) to-do (4) C++ (3) Chrome (3) Divide and Conquer (3) Graph Algorithm (3) Permutation (3) Powershell (3) Random (3) Segment Tree (3) UIMA (3) Union-Find (3) Video (3) Virtualization (3) Windows (3) XML (3) Advanced Data Structure (2) Android (2) Bash (2) Classic Algorithm (2) Debugging (2) Design Pattern (2) Google (2) Hadoop (2) Java Collections (2) Markov Chains (2) Probabilities (2) Shell (2) Site (2) Web Development (2) Workplace (2) angularjs (2) .Net (1) Amazon Interview (1) Android Studio (1) Array (1) Boilerpipe (1) Book Notes (1) ChromeOS (1) Chromebook (1) Codility (1) Desgin (1) Design (1) Divide and Conqure (1) GAE (1) Google Interview (1) Great Stuff (1) Hash (1) High Tech Companies (1) Improving (1) LifeTips (1) Maven (1) Network (1) Performance (1) Programming (1) Resources (1) Sampling (1) Sed (1) Smart Thinking (1) Sort (1) Spark (1) Stanford NLP (1) System Design (1) Trove (1) VIP (1) tools (1)

Popular Posts