leetcode: Best Meeting Point

本文探讨了如何在一个二维网格中找到一个位置,使得该位置到所有标记为人们所在位置的点的曼哈顿距离之和最小。通过分别计算所有点的行坐标和列坐标的中位数来求解,并给出C++实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

转自:http://blog.youkuaiyun.com/pointbreak1/article/details/49422265

题目:

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?
题解:

先考虑所有点的row值,如上图为0, 0, 2,则中值为0, 所有点距中值的距离和为(0 - 0) + (0 - 0) + (2 - 0) = 2

同理,考虑所有点的cols值,上图为,0, 2, 4,中值为2,所有点距中值的距离和为(2- 0) + (2 - 2) + (4 - 2) = 4,

所以总距离为2 + 4 = 6。

C++版:

[cpp]  view plain  copy
  1. class Solution {  
  2. public:  
  3.     int minTotalDistance(vector<vector<int>>& grid) {  
  4.         if(grid.size() == 0)  
  5.             return 0;  
  6.         vector<int> rows, cols;  
  7.         for(int i = 0; i < grid.size(); i++) {  
  8.             for(int j = 0; j < grid[0].size(); j++) {  
  9.                 if(grid[i][j] == 1)  
  10.                     rows.push_back(i);  
  11.             }  
  12.         }  
  13.         for(int j = 0; j < grid[0].size(); j++) {  
  14.             for(int i = 0; i < grid.size(); i++) {  
  15.                 if(grid[i][j] == 1)  
  16.                     cols.push_back(j);  
  17.             }  
  18.         }  
  19.         int distance = 0;  
  20.         int mid = rows.size() / 2;  
  21.         for(int i = 0; i < rows.size(); i++)  
  22.             distance += abs(rows[i] - rows[mid]);  
  23.         mid = cols.size() / 2;  
  24.         for(int i = 0; i < cols.size(); i++)  
  25.             distance += abs(cols[i] - cols[mid]);  
  26.         return distance;  
  27.     }  
  28. };  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值