一个不能少:有k个有序的数组,请找到一个最小的数字范围。使得这k个有序数组中,每个数组都至少有一个数字在该范围中。例如:1: 4, 10, 15, 24, 26;2: 0, 9, 12, 20;3: 5, 18, 22, 30。所得最小范围为[20,24],其中,20在2中,22在3中,24在1中。请关注微信公众账号“待字闺中”。
#include <stdio.h>
int data[2][100]={0};
int min(int x, int y,int z){
if(x<=y){
if(x<=z)
return x;
else
return z;
}
else
if(y<=z)
return y;
else
return z;
}
int diff(int x, int y, int z){
if( x==y || x==z || y==z)
return 0;
else
return 1;
}
void build(int a[], int b[], int c[], int len1, int len2, int len3){
/*
* build the n*2 array to store the final data.
* data[0][i] is the original array sequence
* data[1][i] is the number
* need to be changed if the array is more than 3, also the min() func
*/
int i;
int *p1 = a;
int *p2 = b;
int *p3 = c;
int length_total = len1+len2+len3;
printf("build_length_total=%d\n",length_total);
for(i=0;i<length_total;i++){
if(len1 && min(*p1,*p2,*p3) == *p1){
data[1][i] = *p1;
data[0][i] = 1;
len1--;
p1++;
}
else if(len2 && min(*p1,*p2,*p3) == *p2){
data[1][i] = *p2;
data[0][i] = 2;
len2--;
p2++;
}
else if(len3 && min(*p1,*p2,*p3) == *p3){
data[1][i] = *p3;
data[0][i] = 3;
len3--;
p3++;
}
else
break;
if(len1 == 0)
*p1 = 10000;
if(len2 == 0)
*p2 = 10000;
if(len2 == 0)
*p2 = 10000;
}
}
void main(void){
int a[5]={4,10,15,24,26};
int b[4]={6,9,12,20};
int c[4]={5,18,22,30};
int i,j,gap;
int length_a= sizeof(a)/sizeof(a[0]);
int length_b= sizeof(b)/sizeof(b[0]);
int length_c= sizeof(c)/sizeof(c[0]);
int length_total = length_a+length_b+length_c;
build(a,b,c,length_a,length_b,length_c);
gap = data[1][2]-data[1][0];
j = 0;
for(i=1;i<length_total-2;i++){
if(diff(data[0][i+2],data[0][i+1],data[0][i])){
if(gap>(data[1][i+2]-data[1][i])){
gap = data[1][i+2]-data[1][i];
j = i;
}
}
}
printf("gap=%d,the array is [%d %d %d]\n",gap,data[1][j],data[1][j+1],data[1][j+2]);
}