[LeetCode] 296。ベストミーティングポイントベスト会場
296 Best Meeting Point Best Venue
2人以上のグループが会い、総移動距離を最小化したいと考えています。値0または1の2Dグリッドが与えられ、各1はグループ内の誰かの家を示します。距離は以下を使用して計算されます マンハッタン距離 、ここで、distance(p1、p2)= |p2.x - p1.x| + |p2.y - p1.y|
。
たとえば、(0,0)
、(0,4)
、および(2,2)
に住んでいる3人の場合:
(0,2)
ポイントpublic class Solution { public int minTotalDistance(int[][] grid) { List ipos = new ArrayList() List jpos = new ArrayList() // What are the statistics of horizontal and vertical coordinates for(int i = 0 i
ヒント:
- 最初に一次元でそれを解決してみてください。このソリューションを2次元の場合にどのように適用できますか?
最高の待ち合わせ場所を得るには、マンハッタンの各距離を最小のポイントに配置する必要があります。
一次元に見える場合、A点とB点の2点があります。
______A_____P_______B_______
したがって、座位P [A、B]の間隔である限り、距離AとBの間の距離に関係なく、Pが[A、B]の間にない場合、距離とaとBの間の距離よりも大きくなり、2つの点CとDを加えます。
______C_____A_____P_______B______D______
点Pの最適な位置は[A、B]間隔であり、そのような4つの点と距離ABは、距離CDに距離を加えたものです。その他の距離は距離より少し大きくなります。ソートされた位置に、最初の座標と最後の座標、つまり距離CD、最後から2番目の座標から2番目の座標、つまり距離ABを引くなど、最も停止する位置の中央まで、次の1次元分析が行われます。状況は、2次元の場合は2次元の合計である可能性があります
解決策:垂直方向と水平方向の分離
複雑さ:時間O(NM)空間O(NM)
最小の全長を確保するために、1-> 2-> 3のように、ライン上の各パスを繰り返さないようにします。<-4 of such a dimension, if the starting point is 1, 2, and 4, then 2->3および1-> 2-> 32つのパスが繰り返されます。右の点が左に行き、左の点がすぐに行くようにするために、交点としてこれらの中間点に行く必要があります。マンハッタンの距離なので、横軸と縦軸を別々に計算できるので、結果は同じです。したがって、各横軸の中点から横軸までの距離を計算し、さらに各縦座標の中点までの距離を計算します。
Java:
class Solution { public: int minTotalDistance(vector& grid) { vector rows, cols for (int i = 0 i C ++:
class Solution { public: int minTotalDistance(vector& grid) { vector rows, cols for (int i = 0 i C ++:
1 - 0 - 0 - 0 - 1 | | | | | 0 - 0 - 0 - 0 - 0 | | | | | 0 - 0 - 1 - 0 - 0
同様のトピック: