俗话说的好,远亲不如近邻。现在牛牛想知道,对于每个搬家方案,搬家后与最近的居民的距离为多少。
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; } };