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

来源:互联网 发布:yoga lenovo 知乎 编辑:程序博客网 时间:2024/05/16 12:06

思路:首先找出给定值在给定数组中的插入位置(不是真的将给定值插入给定数组),然后以此位置为基准,向左或向右依次找出最接近的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;}





0 0
原创粉丝点击