[LeetCode] Best Meeting Point

Problem Description:

A group of two or more people wants to meet and minimize the total travel distance. You are given a 2D grid of values 0 or 1, where each 1 marks the home of someone in the group. The distance is calculated using Manhattan Distance, where distance(p1, p2) = |p2.x - p1.x| + |p2.y - p1.y|.

For example, given three people living at (0,0)(0,4), and (2,2):

1 - 0 - 0 - 0 - 1
|   |   |   |   |
0 - 0 - 0 - 0 - 0
|   |   |   |   |
0 - 0 - 1 - 0 - 0

The point (0,2) is an ideal meeting point, as the total travel distance of 2+2+2=6 is minimal. So return 6.

Hint:

    1. Try to solve it in one dimension first. How can this solution apply to the two dimension case?

Since the distance is computed using the Manhattan Distance, we can decompose this 2-d problem into two 1-d problems and combine (add) their solutions. In fact, the best meeting point is just the point that comprised by the two best meeting points in each dimension.

For the 1d case, the best meeting point is just the median point.

This post shares a nice Python code. However, translating it into C++ makes it so ugly...

 1 class Solution {
 2 public:
 3     int minTotalDistance(vector<vector<int>>& grid) {
 4         int m = grid.size(), n = grid[0].size();
 5         vector<int> ii, jj;
 6         for (int i = 0; i < m; i++) {
 7             for (int j = 0; j < n; j++) {
 8                 if (grid[i][j]) {
 9                     ii.push_back(i);
10                     jj.push_back(j);
11                 }
12             }
13         } 
14         sort(jj.begin(), jj.end());
15         int c = ii.size(), s = 0, io = ii[c/2], jo = jj[c/2];
16         for (int i : ii) s += abs(i - io);
17         for (int j : jj) s += abs(j - jo);
18         return s;
19     }
20 }; 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值