[Leetcode /分]要素に最も近い2 Kを発見した(スライディングウィンドウの二部の+)

問題の説明:

ソート二つの整数の良い配列を考えるkx、アレイから最も近い見つける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]

 

説明:

  1. k値は正であり、そして指定された配列の長さは、ソートされるよりも常に小さいです。
  2. アレイが空ではなく、これ以上104以下の長さ
  3. アレイ内の各要素の絶対値以上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};
}
};

その他の経験:

  1.  3バイナリテンプレートがに注意を払う必要があります使用中は、それを解決する方法を見つける、左または右の状況に駐車しました(それが最終的に左側に停止した場合今私は、変更、中旬に結果を確認するためのより良い方法はありませんが、右=ミッド右側に駐車した場合、要件を満たすために- 1)
  2.  時々 、私たちは実際には、このウィンドウをスライディング+二分法で、ユニットの半分の間隔になります
发布了137 篇原创文章 · 获赞 19 · 访问量 1万+

おすすめ

転載: blog.csdn.net/qq_43338695/article/details/102775608