时间限制:C/C++ 3秒,其他语言6秒 空间限制:C/C++ 256M,其他语言512M 热度指数:1372
题目描述
牛牛最近搬到了一座新的城镇,这个城镇可以看成是一个一维的坐标系。城镇上有n个居民,第i个居民的位置为a_iai。现在牛牛有m个搬家方案,在第i个方案中他会搬到位置x_ixi。
俗话说的好,远亲不如近邻。现在牛牛想知道,对于每个搬家方案,搬家后与最近的居民的距离为多少。
示例1
输入
3,2,[2,4,7],[5,8]
输出
[1,1]
说明
第一个方案搬到位置5,与5最近的居民在位置4,距离为1.
第二个方案搬到位置8,与8最近的居民在位置7,距离为1
备注:
1\le n,m\le100000, 0\le |a_i|,|x_i|\le 1e91≤n,m≤100000,0≤∣ai∣,∣xi∣≤1e9
第一个参数为int型变量,代表居民个数n
第二个参数为int型变量,代表方案个数m
第三个参数为vector<int>,包含n个元素代表n个居民的位置
第四个参数为vector<int>,包含m个元素代表m个方案对应的位置
2分查找练习
#include<algorithm>
class Solution {
public:
/**
* 远亲不如近邻
* @param n int整型 居民个数
* @param m int整型 方案个数
* @param a int整型vector 居民的位置
* @param x int整型vector 方案对应的位置
* @return int整型vector
*/
// 函数声明
//int FindPosition(vector<int>& a,int key);
// 返回最近的距离
int FindPosition(vector<int>& a,int key)
{
int nStar = 0;
int nEnd = a.size() - 1;
int nCur = (nStar + nEnd) / 2;
// 初始化最小距离为int类型的最大值
// int nSmallestPos = 2^31 - 1 + 2^31;
int nSmallestPos = 2147483647;
//) while(nStar != nEnd)
while(nStar <= nEnd )
{
// 找到位置一样的居民
if(a[nCur] == key)
return 0;
// 搬家后的位置在当前居民的位置后面
if(a[nCur] < key)
{
// 更新最小距离
if(key - a[nCur] < nSmallestPos)
{
nSmallestPos = key - a[nCur];
}
// 更新检索起点
nStar = nCur + 1;
}
// 搬家后的位置在当前居民的位置前面
if(a[nCur] > key)
{
// 更新最小距离
if(a[nCur] - key < nSmallestPos)
{
nSmallestPos = a[nCur] - key;
}
// 更新检索中终点
nEnd = nCur - 1;
}
// 更新中点值,不然导致死循环,段错误
nCur = (nStar + nEnd) / 2;
}
return nSmallestPos;
}
vector<int> solve(int n, int m, vector<int>& a, vector<int>& x) {
// write code here
vector<int> obj;
// 考虑a数组即居民的位置是否有序
// 将a数据进行排序
sort(a.begin(), a.end());
for(unsigned int i = 0; i < x.size(); i++)
{
// 通过2分查找找到最近距离。
obj.push_back(FindPosition(a, x[i]));
}
return obj;
}
};