Given a sorted array arr[] and a value x, find the k closest elements to x in arr[].
input: k=4, x=35
arr[] = {12,16,22,30,35,39,42,45,48,50,53,55,56}
output:30 39 42 45
解法:二分查找,找到crossover point,然后从这个交叉点开始继续二分比较。若x的值与数组中某元素相等,则不输出,假设该数组中没有与x相等的重复元素。若有重复元素,则增加计数器,若计数器为0,则不输出当前值,若不为0,则输出该值。
package p_2;
public class Main {
public static int[] a = {12,16,22,30,35,39,42,45,48,50,53,55,56};
public static void crossPoint(int left, int right, int[] a,int data,int level)
{
if(left == right || left+1 == right)
{
print(left,right,data,level);
return;
}else
{
int mid = (left+right)/2;
if(a[mid]>data)
{
right = mid;
crossPoint(left,right,a,data,level);
}else if(a[mid]<data)
{
left = mid;
crossPoint(left,right,a,data,level);
}else
{
left = mid;
right = mid;
crossPoint(left,right,a,data,level);
}
}
}
public static void print(int left,int right,int data,int level){
int count =0;
if(left == right)
{
left--;
right++;
while(count!=4)
{
if(left>=0&&right<a.length)
{
if((data-a[left])>(a[right]-data))
{
System.out.println(a[right]);
right++;
count++;
}else if((data-a[left])<(a[right]-data))
{
System.out.println(a[left]);
left--;
count++;
}else if((data-a[left])==(a[right]-data)){
System.out.println(a[right]);
right++;
count++;
}
}else if(left<0)
{
System.out.println(a[right]);
right++;
count++;
}else if(right>=a.length)
{
System.out.println(a[left]);
left--;
count++;
}
}
}else{
while(count!=level)
{
if(left>0&&right<a.length)
{
if((data-a[left])>(a[right]-data))
{
System.out.println(a[right]);
right++;
count++;
}else if((data-a[left])<(a[right]-data))
{
System.out.println(a[left]);
left--;
count++;
}else if((data-a[left])==(a[right]-data)){
System.out.println(a[right]);
right++;
count++;
}
}else if(left<=0)
{
System.out.println(a[right]);
right++;
count++;
}else if(right>=a.length)
{
System.out.println(a[left]);
left--;
count++;
}
}
}
}
public static void main(String args[])
{
int level = 4;
int left = 0;
int right = a.length;
int data = 49;
crossPoint(left,right,a,data,level);
}
}