C ++
 Computer >> コンピューター >  >> プログラミング >> C ++

C++でK個の最も近い要素を検索する


並べ替えられた配列があり、2つの整数kとxも指定されているとすると、その配列内でxに最も近いk個の要素を見つける必要があります。結果は昇順で並べ替える必要があります。同点の場合は、常に小さい要素が優先されます。したがって、入力が[1,2,3,4,5]のようで、k =4、x =3の場合、出力は[1,2,3,4]

になります。

これを解決するには、次の手順に従います-

  • ansという配列を作成します
  • 低設定:=0、高:=配列のサイズ– k
  • 低い<高い
    • 中:=低+(高-低)/ 2
    • x – arr [mid]> arr [mid + k] – xの場合、low:=mid + 1、それ以外の場合はhigh:=mid
  • 低から低+kの範囲のiの場合
    • arr[i]をans配列に挿入します
  • 回答を返す
例(C ++)

理解を深めるために、次の実装を見てみましょう-

#include <bits/stdc++.h>
using namespace std;
void print_vector(vector<auto> v){
   cout << "[";
   for(int i = 0; i<v.size(); i++){
      cout << v[i] << ", ";
   }
cout << "]"<<endl;
}
class Solution {
public:
   vector<int> findClosestElements(vector<int>& arr, int k, int x) {
      vector <int> ans;
      int low = 0;
      int high = arr.size() - k;
      while(low < high){
         int mid = low + (high - low)/2;
         if(x - arr[mid] > arr[mid + k] - x){
            low = mid + 1;
         }
         else high = mid;
      }
      for(int i = low ; i < low + k ; i++)ans.push_back(arr[i]);
      return ans;
   }
};
main(){
   Solution ob;
   vector<int> v = {1,2,3,4,5};
   print_vector(ob.findClosestElements(v, 4, 3));
}

入力

[1,2,3,4,5]
4
3

出力

[1,2,3,4]

  1. C++で汚染された二分木の要素を検索する

    二分木があるとします。そのツリーのルールは次のとおりです- root.val ==0 treeNode.valがxで、treeNode.leftがnullでない場合、treeNode.left.val =2 * x + 1 treeNode.valがxで、treeNode.rightがnullでない場合、treeNode.right.val =2 * x + 2 今、二分木が汚染されているので。これは、ツリーノードのすべての値が-1に変更されたことを示します。最初にバイナリツリーを回復してから、次のようにFindElementsクラスを実装する必要があります-

  2. C++の二分木で最も近い葉を見つけます

    1つの二分木が与えられたとします。さまざまなレベルのリーフノードがあります。ノードを指す別のポインターが与えられます。尖ったノードから最も近いリーフノードまでの距離を見つける必要があります。ツリーが以下のようであると考えてください- ここで、リーフノードは2、-2、および6です。ポインタがノード-5を指している場合、-5から最も近いノードは距離1になります。 これを解決するために、指定されたノードをルートとするサブツリーをトラバースし、サブツリー内で最も近いリーフを見つけて、距離を保存します。ここで、ルートからツリーをトラバースします。ノードxが左側のサブツリーに存在する場合は、右側