给定一整数在有序的整数数组中找出与给定值最接近的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; }
声明:该文观点仅代表作者本人,牛骨文系教育信息发布平台,牛骨文仅提供信息存储空间服务。
- 上一篇: java折半查找法 查找数组中与目标数最接近的数
- 下一篇: 在排序数组中查找和为给定值的两个数字