牛骨文教育服务平台(让学习变的简单)
博文笔记

给定一整数在有序的整数数组中找出与给定值最接近的k个整数

创建时间:2016-08-13 投稿人: 浏览次数:1371

思路:首先找出给定值在给定数组中的插入位置(不是真的将给定值插入给定数组),然后以此位置为基准,向左或向右依次找出最接近的k个整数。

难点:个人在处理过程中的难点在于向左或向右移动过程中的确切位置的确定。

代码:


<pre class="cpp" name="code"><span style="font-size:14px;"><span style="color:#ff0000;">//找出value在数组中的应该插入位置
</span>int kPosition(int A[], int nLength,int value)
{
	int pos = 0;
	int i = 0;
	for (; i < nLength; ++i)
	{
		if (A[i]>value)
		{
			pos = i;
			break;
		}
	}
	if (i == nLength)
	{
		return nLength-1;
	}
	else
	{
		return pos;
	}
}</span>

<span style="color:#ff0000;">//记录k个值</span>
vector<int> kNumber(int A[], int nLength, int pos,int value,int k)
{
	vector<int>result;
	if (pos == 0)
	{
		result.assign(A, A + k);//将数组中的元素复制到vector中
		return result;
	}
	if (pos == nLength - 1)
	{
		result.assign(A + nLength - k, A + nLength);
		return result;
	}
	int posMid = abs(A[pos-1] - value) >= abs(A[pos] - value) ? pos : pos-1;//首先找到绝对差值                                                                                //最小位置
	int posFront = posMid;//将刚开始的前位置同时指向绝对差值最小位置
	int posBehind = posMid;//将刚开始的后位置同时指向绝对差值最小位置
        int posNextFront = posMid-1;//下一个前位置
        int posNextBehind =posMid+1;//下一个后位置
	while (posBehind - posFront < k-1)
	{
		if (abs(A[posNextFront]-value) >= abs(A[posNextBehind]-value))
		{
			posBehind = posNextBehind;
			if (posNextBehind < nLength - 1)
			{
				++posNextBehind;
			}
			else
			{
				posFront = posNextFront;//已到结尾,必须前向增加
				--posNextFront;
			}
		}
		else
		{
			posFront = posNextFront;
			if (posNextFront > 0)
			{
				--posNextFront;
			}
			else
			{
				posBehind = posNextBehind;//已到头,必须后向增加
				++posNextBehind;
			}
		}
	}
	 result.assign(A + posFront, A + posBehind+1);
	return result;
}






声明:该文观点仅代表作者本人,牛骨文系教育信息发布平台,牛骨文仅提供信息存储空间服务。