题目关键点:
a数组元素是每个邻居在坐标上的位置(一维坐标),x数组元素是牛牛搬家之后在坐标上的位置
要求每次搬家后最近邻居的最近距离
方法一:暴力解法
枚举x数组和a数组,定义一个ans数组保存每轮循环中找到的x[i]与a[i]之差的最小绝对值
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 int[]ans=new int[x.length]; //枚举x[i] for(int i=0;i<x.length;i++){ //找完一轮的最小值需要开始下一轮寻找时记得初始化min int min=Integer.MAX_VALUE; //枚举a[j] for(int j=0;j<a.length;j++) min=Math.min(Math.abs(x[i]-a[j]),min);//在a数组中找到离x[i]最近的,记录它们的差 ans[i]=min; } return ans; } }
复杂度:
时间复杂度:双重循环,最坏时间复杂度为
空间复杂度:额外使用数组大小不超过m,空间复杂度为
方法二:二分查找
寻找x[i]的插入位置,直接查找a数组的时间复杂度较高,我们可以使用二分查找
先对a数组排序,再枚举搬家方案x[i]:
在a数组中用二分法查找距离x[i]最近的元素,计算两数之差的绝对值
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 int[]ans=new int[x.length]; //首先对a数组排序 Arrays.sort(a); //枚举搬家方案x[i] for(int i=0;i<x.length;i++){ //二分查找 int l=0,r=a.length-1; int mid=(l+r)/2; //初始化最近距离的邻居为a[mid],最近距离为它们的差的绝对值 int min=Math.abs(a[mid]-x[i]); while(l<r){ //在[mid+1,r]区间找 if(x[i]>a[mid])l=mid+1; //在[l,mid-1]区间找 else if(x[i]<a[mid])r=mid-1; //如果找到和x[i]相等的数,则最近距离为0 else {min=0;break;} mid=(l+r)/2; //找到缩小区间的中间值并更新最小值 min=Math.min(min,Math.abs(a[mid]-x[i])); }ans[i]=min; } return ans; } }
复杂度:
时间复杂度:二分法的时间复杂度为 ,整体时间复杂度为
空间复杂度:ans数组的大小为m,空间复杂度为