这个问题暂时做了两个思路,第一种从头到尾不断相加,因为两个数组都是排好序的,那就从头往后,直到相加的结果为第k 个,代码为
int findKthSmall(vector<int> &a, vector<int> &b, int k)
{
int aindex = 0, bindex = 0;
int alen = a.size(), blen = b.size();
//cout<<alen<<'\t'<<blen<<endl;
if (alen + blen < k) return INT_MIN;
while (aindex<alen && bindex<blen)
{
if (a[aindex] < b[bindex])
{
aindex++;
//每次进行判断,若遍历到a时达到k,则返回a[aindex-1]
if (aindex + bindex == k) return a[aindex - 1];
}
else
{
bindex++;
//每次进行判断,若遍历到b时达到k,则返回b[bindex-1]
if (aindex + bindex == k) return b[bindex - 1];
}
}
while (aindex < alen)
{
aindex++;
if (aindex + bindex == k) return a[aindex - 1];
}
while (bindex < blen)
{
bindex++;
if (aindex + bindex == k) return b[bindex - 1];
}
}
第二种做法,是一种二分的想法,既然要找第k个,可以先找两个数组2/k个位置,哪个小哪个就去掉了嘛,当然判断有三种情况的,重复直到k为1,当然最后输出结果的时候再判断一下。
int findKthSmall(vector<int> &a, vector<int> &b, int k)
{
int temp = 0;
while (k != 1)
{
temp = k / 2-1;
if (a[temp] < b[temp])
{
for (int i = 0; i <=temp; i++)
{
a.erase(a.begin());
}
}
else if(a[temp] > b[temp])
{
for (int i = 0; i <=temp; i++)
{
b.erase(b.begin());
}
}
else
{
return a[temp];
break;
}
k = k - temp-1;
}
if (a.size() > 0 && b.size() > 0)
{
return MIN(a[0], b[0]);
}
else if (a.size() > 0)
{
return a[0];
}
else
{
return b[0];
}
}