[LeetCode] Best Meeting Point

本文介绍了一种解决多人聚会地点选择问题的算法,目标是找到一个位置,使得所有参会者从各自家中到该地点的曼哈顿距离之和最小。通过在每个维度上分别求解中位数并组合,最终确定最优聚会地点。

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

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?

This problem can be solved in each dimension and combine them together. And it can be proved that the median is the smallest point. Actually, the points between two medians in even length of numbers are the same value. So, for the simple case, we can just use the less one when it's even length.
int minTotalDistance(vector<vector<int>>& grid) {
	vector<int> x, y;
	int rowlen=grid.size();
	if(!rowlen) return 0;
	int collen = grid[0].size();
	if(!collen) return 0;
	
	for(int i=0;i<rowlen;i++)
	{
		for(int j=0;j<collen;j++)
		{
			if(grid[i][j]) 
<span style="white-space:pre">			</span>{
<span style="white-space:pre">				</span>x.push_back(i);
<span style="white-space:pre">				</span>y.push_back(j);
<span style="white-space:pre">			</span>}
		}
	}
	int xm=x[x.size()/2];
	int ym=y[y.size()/2];
	int s=0;
	for(int i=0;i<x.size();i++)
	{
		s+=abs(x[i]-xm);
	}
	for(int i=0;i<x.size();i++)
	{
		s+=abs(y[i]-ym);
	}
	return s;

}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值