俗话说的好,远亲不如近邻。现在牛牛想知道,对于每个搬家方案,搬家后与最近的居民的距离为多少。
3,2,[2,4,7],[5,8]
[1,1]
第一个方案搬到位置5,与5最近的居民在位置4,距离为1.第二个方案搬到位置8,与8最近的居民在位置7,距离为1
第一个参数为int型变量,代表居民个数n第二个参数为int型变量,代表方案个数m第三个参数为vector<int>,包含n个元素代表n个居民的位置第四个参数为vector<int>,包含m个元素代表m个方案对应的位置
class Solution {
public:
vector<int> solve(int n, int m, vector<int>& a, vector<int>& x) {
// m -> x[]
// n -> a[]
// 在x里找一个数x[i],再在a里找一个数a[i],使得a[i]和x[i]距离最小,计算出距离
vector<int> res;
sort(a.begin(), a.end());
for(int i = 1; i <= m; ++i){
//每个方案
int temp = x[i - 1];
//二分
int m1 = 0;
int n1 = a.size() - 1;
int drop = INT_MAX;
while(m1 <= n1){
int mid = m1 + (n1 - m1)/2;
if(abs(a[mid] - temp) < drop){
drop = abs(a[mid] - temp);
}
if(a[mid] < temp){
m1 = mid + 1;
}
else if(a[mid] > temp){
n1 = mid - 1;
}
else{
drop = 0;
break;
}
}
res.push_back(drop);
}
return res;
}
}; class Solution {
public:
/**
* 远亲不如近邻
* @param n int整型 居民个数
* @param m int整型 方案个数
* @param a int整型vector 居民的位置
* @param x int整型vector 方案对应的位置
* @return int整型vector
*/
vector<int> solve(int n, int m, vector<int>& a, vector<int>& x) {
vector<int> v;
sort(a.begin(), a.end());
for(int i=0;i<m;i++){
int l=0, r=n-1, d=INT_MAX;
while(l<=r){
int mid = l + (r-l)/2;
if(abs(a[mid]-x[i]) < d)
d = abs(a[mid]-x[i]);
if(a[mid] == x[i])
break;
else if(a[mid] < x[i])
l = mid+1;
else
r = mid-1;
}
v.push_back(d);
}
return v;
}
}; public int[] solve(int n, int m, int[] a, int[] x) {
if (n <= 0) return new int[0];
int[] res = new int[m];
Arrays.sort(a);
for (int i = 0; i < m; ++i) {
int insertIndex = Arrays.binarySearch(a, x[i]);
if (insertIndex < 0) {
insertIndex = -insertIndex - 1;
if (insertIndex == 0) res[i] = Math.abs(x[i] - a[0]);
else if (insertIndex == n) res[i] = Math.abs(x[i] - a[n - 1]);
else res[i] = Math.min(a[insertIndex] - x[i], x[i] - a[insertIndex - 1]);
}
}
return res;
} class Solution: def solve(self , n , m , a , x ): # write code here dis1 = [] dis2 = [] dis = [] for i in range(0, m): for ii in range(0, n): d = abs(x[i] - a[ii]) dis1.append(d) dis2 = min(dis1) dis1 = [] dis.append(dis2) return dis没人写python的,本萌新来贴一个
主要就是找插入位置,然后判断插入值和插入点相邻值的距离的最小值
先排序,然后用lower_bound找到第一个大于等于目标值的下标,然后根据下标来做进一步
判断处理计算。
class Solution {
public:
/**
* 远亲不如近邻
* @param n int整型 居民个数
* @param m int整型 方案个数
* @param a int整型vector 居民的位置
* @param x int整型vector 方案对应的位置
* @return int整型vector
*/
vector<int> solve(int n, int m, vector<int>& a, vector<int>& x) {
vector<int> res;
sort(a.begin(),a.end());
for(int i=0;i<m;i++){
auto it=lower_bound(a.begin(), a.end(), x[i]);
int val;
if(it==a.end()||it==(a.end()--)){
val=x[i]-a[a.size()-1];
}
else if(it==a.begin()||it==(a.begin()++)){
val=a[0]-x[i];
}
else {
val=min(abs(x[i]-*(it--)),abs(*it-x[i]));
}
res.push_back(val);
}
return res;
}
}; import java.util.*;
public class Solution {
/**
* 远亲不如近邻
* @param n int整型 居民个数
* @param m int整型 方案个数
* @param a int整型一维数组 居民的位置
* @param x int整型一维数组 方案对应的位置
* @return int整型一维数组
*/
public int[] solve (int n, int m, int[] a, int[] x) {
// write code here
Arrays.sort(a);
int[] res = new int[m];
for(int i = 0;i < m;i++){
res[i] = getRes(a,x[i]);
}
return res;
}
public static int getRes(int[] arr,int target){
int nearest = Math.min(Math.abs(arr[0] - target),Math.abs(arr[arr.length - 1] - target));
int l = 0,r = arr.length - 1;
int mid = (l + r) / 2;
nearest =Math.abs( Math.min(Math.abs(arr[mid] - target),nearest));
while(l < r){
if(arr[mid] > target){
r = mid - 1;
}else if(arr[mid] < target){
l = mid + 1;
} else{
return 0;
}
mid = (l + r) / 2;
nearest =Math.abs( Math.min(Math.abs(arr[mid] - target),nearest));
}
nearest = Math.abs(Math.min(nearest,Math.abs(arr[l] - target)));
return nearest;
}
} import java.util.*;
public class Solution {
public static void main(String[] args) {
int[] a= {175202325,305348361,18225345,1076950,259307096};
int[] x={-435704854,-196047871,-40657348,-638779837,289329995};
Arrays.sort(a);
int z[]=solve(5,5,a,x);
System.out.println(Arrays.toString(z));
}
/** * 远亲不如近邻
* @param n int整型 居民个数
* @param m int整型 方案个数
* @param a int整型一维数组 居民的位置
* @param x int整型一维数组 方案对应的位置 * @return int整型一维数组
*/
public static int[] solve(int n, int m, int[] a, int[] x) {
// write code here
int[] re=new int[m];
TreeSet ts=new TreeSet();
//有序集合
for (int i = 0; i ; i++) {
ts.add(a[i]);
}
for (int i = 0; i ; i++) {
if(x[i]>=a[n-1]){
re[i]=x[i]-a[n-1];
} else if(x[i]0]){
re[i]=a[0]-x[i];
}else{
int hi=ts.ceiling(x[i]);//>=
int lo=ts.lower(x[i]);//<
re[i]=(hi-x[i]);
}
}
return re;
}
} class Solution {
public:
/**
* 远亲不如近邻
* @param n int整型 居民个数
* @param m int整型 方案个数
* @param a int整型vector 居民的位置
* @param x int整型vector 方案对应的位置
* @return int整型vector
*/
int binSearch(vector<int>&a , int b){
int len=a.size();
int l=0;
int r=len-1;
int m=0;
bool find=false;
while(r>l){
m=(r+l)>>1;
if(a[m]>b)
r=m-1;
else if(a[m]<b)
l=m+1;
else{
find=true;
break;
}
}
if(find)
return 0;
else{
if(a[l]>b){
if(l!=0)
return min(a[l]-b,b-a[l-1]);
else
return a[0]-b;
}else{
if(l!=len-1)
return min(b-a[l],a[l+1]-b);
else
return b-a[len-1];
}
}
}
vector<int> solve(int n, int m, vector<int>& a, vector<int>& x) {
// write code here
sort(a.begin(),a.end());
vector<int> dis;
for(auto &c:x){
dis.push_back(binSearch(a, c));
}
return dis;
}
}; class Solution {
public:
/**
* 远亲不如近邻
* @param n int整型 居民个数
* @param m int整型 方案个数
* @param a int整型vector 居民的位置
* @param x int整型vector 方案对应的位置
* @return int整型vector
*/
vector<int> solve(int n, int m, vector<int>& a, vector<int>& x) {
vector<int> res;
// write code here
sort(a.begin(),a.end());
for(auto c:x){
res.push_back(getMindistance(n,a,c));
}
return res;
}
int getMindistance(int n, vector<int>& a,int c){
int start=0;
int end=n;
while(start!=end){
int mid=start+(end-start)/2;
if(c<a[mid]){
if(mid-1<start){
return a[mid]-c;
}else{
if(a[mid-1]<=c){
return min(c-a[mid-1],a[mid]-c);
}else{
end=mid;
}
}
}else if(c>a[mid]){
if(mid+1>=end){
return c-a[mid];
}else{
if(a[mid+1]<c){
start=mid+1;
}else{
return min(c-a[mid],a[mid+1]-c);
}
}
}else {
return 0;
}
}
}
}; 二分查找
class Solution {
private:
vector<int> res;
public:
vector<int> solve(int n, int m, vector<int>& a, vector<int>& x) {
sort(a.begin(), a.end());
for (int i = 0; i < m; i++)
res.push_back(binary_search(a, x[i]));
return res;
}
int binary_search(vector<int> &a, int target)
{
int left = 0, right = a.size() - 1;
while (left <= right)
{
int mid = (left + right) / 2;
if (a[mid] == target)
return 0;
else if (a[mid] < target)
left = mid + 1;
else
right = mid - 1;
}
int min_num = INT_MAX;
for (int i = left - 1; i <= left + 1; i++)
{
if (i < a.size() && i >= 0)
min_num = min(min_num, abs(target - a[i]));
}
return min_num;
}
};