問題の説明:
ソート二つの整数の良い配列を考えるk
とx
、アレイから最も近い見つけるx
(2最小の差の数)k
数。結果が返された場合は適切に昇順に配置しなければなりません。有する2つの数値がある場合、x
差が小さい値の好みの数として、。
例1:
入力:。[1,2,3,4,5]、K = 4、X = 3 出力: [1,2,3,4]
例2:
入力: [1,2,3,4,5]、K = 4、X = -1 出力: [1,2,3,4]
説明:
- k値は正であり、そして指定された配列の長さは、ソートされるよりも常に小さいです。
- アレイが空ではなく、これ以上104以下の長さ
- アレイ内の各要素の絶対値以上104 xは
基本的な考え方:
ポインタの周りに間隔の最も近い要素を検索バイナリ使用して、最終的に結果セットの間隔を横断する結果を追加。
ACコード:
class Solution {
public:
vector<int> findClosestElements(vector<int>& arr, int k, int x) {
if(arr.size() == 1){
return arr;
}
int beg = 0;
int end = arr.size() - k;
while(beg < end){
int mid = beg + (end - beg)/2;
if(abs(arr[mid] - x) > abs(arr[mid + k] -x)){
beg = mid + 1;
}
else{
end = mid;
}
}
return vector<int>{arr.begin()+beg, arr.begin()+beg+k};
}
};
ダニエルさんのアイデア:
kは一緒に結合したk番目の要素の一定の要素であるからです。
だから我々は、スライディングウィンドウを考えました。
ウィンドウは、左端と右端の要素が最後の二つの要素の要件に沿ったものである、我々は、ウィンドウを移動し、唯一のライン上のエッジ位置を決定する必要があります。
また、二分法思考が使用され、およそ実際に正しいと思います。
class Solution {
public:
vector<int> findClosestElements(vector<int>& arr, int k, int x) {
if(arr.size() == 1){
return arr;
}
int beg = 0;
int end = arr.size() - k;
while(beg < end){
int mid = beg + (end - beg)/2;
if(abs(arr[mid] - x) > abs(arr[mid + k] -x)){
beg = mid + 1;
}
else{
end = mid;
}
}
return vector<int>{arr.begin()+beg, arr.begin()+beg+k};
}
};
その他の経験:
- 3バイナリテンプレートがに注意を払う必要があります使用中は、それを解決する方法を見つける、左または右の状況に駐車しました。(それが最終的に左側に停止した場合今私は、変更、中旬に結果を確認するためのより良い方法はありませんが、右=ミッド右側に駐車した場合、要件を満たすために- 1)
- 時々 、私たちは実際には、このウィンドウをスライディング+二分法で、ユニットの半分の間隔になります。