牛牛最近搬到了一座新的城镇,这个城镇可以看成是一个一维的坐标系。城镇上有n个居民,第i个居民的位置为aia_iai。现在牛牛有m个搬家方案,在第i个方案中他会搬到位置xix_ixi。
/**
* Copyright (C), 2018-2020
* FileName: solve001
* Author: xjl
* Date: 2020/7/8 9:13
* Description: 题目描述 牛牛最近搬到了一座新的城镇,这个城镇可以看成是一个一维的坐标系。城镇上有n个居民,第i个居民的位置为aia_iai。现在牛牛有m个搬家方案,在第i个方案中他会搬到位置xix_ixi。 俗话说的好,远亲不如近邻。现在牛牛想知道,对于每个搬家方案,搬家后与最近的居民的距离为多少。
*/
package second_category;
import org.junit.Test;
public class solve001 {
//通过率只有80%
/**
* 远亲不如近邻
*
* @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) {
//返回的结果
int[] result = new int[m];
//遍历两次的x的数据 每一个在数组中最小的元素
for (int i = 0; i < m; i++) {
int min=Math.abs(x[i]-a[0]);
for (int j = 0; j < n; j++) {
int res=Math.abs(x[i]-a[j]);
min=min nums2.length) {
int[] temp = nums1;
nums1 = nums2;
nums2 = temp;
}
int m = nums1.length;//短的数组
int n = nums2.length;//长的数组
//分割线左右两边的所需要的满足的个数
int totalleft = (m + n + 1) / 2;
//在numns中的找到恰当的分割线[o,m]
//使得nums1[i-1] nums1[i]) {
// //搜索下一轮的区间是 [i+1 right]
// left = i + 1;
// } else {
// //下一轮的搜索区间是 [left,i]
// right = i;
// }
// }
//防止下标的越界的情况
int i = left;
int j = totalleft - i;
int nums1leftmax = i == 0 ? Integer.MIN_VALUE : nums1[i - 1];
int nums1Rightmin = i == m ? Integer.MAX_VALUE : nums1[i];
int nums2leftmax = j == 0 ? Integer.MIN_VALUE : nums2[j - 1];
int nums2Rightmin = j == n ? Integer.MAX_VALUE : nums2[j];
if ((m + n) % 2 == 1) {
return Math.max(nums1leftmax, nums2leftmax);
} else {
return (double) (Math.max(nums1leftmax, nums2leftmax) + Math.min(nums1Rightmin, nums2Rightmin)) / 2;
}
}
}