1. 程式人生 > >給定一整數在有序的整數陣列中找出與給定值最接近的k個整數

給定一整數在有序的整數陣列中找出與給定值最接近的k個整數

思路:首先找出給定值在給定陣列中的插入位置(不是真的將給定值插入給定陣列),然後以此位置為基準,向左或向右依次找出最接近的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;
}