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

C++の配列内のk個の最強の値


arrと呼ばれる数の配列と整数kがあるとします。 | arr [i] --m |の場合、値arr[j]よりも強いと言われる値arr[i]があります。> | arr [j] --m |ここで、mは配列の中央値です。 | arr [i]--m|の場合| arr [j] --m |と同じである場合、arr [i]> arr [j]の場合、arr[i]はarr[j]よりも強力であると言われます。したがって、配列内で最も強いk値のリストを見つける必要があります。

したがって、入力がarr =[1,2,3,4,5]、k =2の場合、出力は[5,1]になります。これは、中央値が3であり、配列の要素が並べ替えられているためです。最強は[5,1,4,2,3]です。ここで最も強い2つの要素は[5、1]です。 [1、5]も有効です。 |5-3|ですが|1-3|と同じですただし、5> 1であるため、5は1よりも強力です。

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

  • 配列を並べ替える

  • n:=arrのサイズ

  • m:=arr [(n-1)/ 2]

  • ペアの配列vを定義する

  • i:=0、j:=n-1

  • 配列retを定義する

  • kがゼロ以外の場合、反復ごとにkを減らし、-

    を実行します。
    • x1:=| arr [j]-m |

    • x2:=| arr [i]-m |

    • x1> =x2の場合、-

      • retの最後にarr[j]を挿入します

      • (jを1つ減らします)

    • それ以外の場合

      • retの最後にarr[i]を挿入します

      • (iを1増やします)

  • retを返す

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

#include <bits/stdc++.h>
using namespace std;
void print_vector(vector<int> v){
   cout << "[";
   for(int i = 0; i<v.size(); i++){
      cout << v[i] << ", ";
   }
   cout << "]"<<endl;
}
class Solution {
public:
   int calc(int x, int m){
      return abs(x - m);
   }
   vector<int> getStrongest(vector<int>& arr, int k) {
      sort(arr.begin(), arr.end());
      int n = arr.size();
      int m = arr[(n - 1) / 2];
      vector<pair<int, int> > v;
      int i = 0;
      int j = n - 1;
      vector<int> ret;
      while (k--) {
         int x1 = calc(arr[j], m);
         int x2 = calc(arr[i], m);
         if (x1 >= x2) {
            ret.push_back(arr[j]);
            j--;
         }
         else {
            ret.push_back(arr[i]);
            i++;
         }
      }
      return ret;
   }
};
main(){
   Solution ob;
   vector<int> v = {1,2,3,4,5};
   print_vector(ob.getStrongest(v,2));
}

入力

{1,2,3,4,5},2

出力

[5, 1, ]

  1. C++のMazeIII

    空のスペースと壁のある迷路があり、その迷路の中にボールもあるとします。ボールは、上(u)、下(d)、左(l)、または右(r)の方向に転がることで空きスペースを通過できますが、壁にぶつかるまで転がり続けます。ボールが止まると、次の方向を選ぶことができます。その迷路にも1つの穴があります。ボールが穴に転がると、ボールは穴に落ちます。 したがって、ボールの位置、穴の位置、迷路がある場合、最短距離を移動することでボールがどのように穴に落ちるかを調べる必要があります。ここで、距離は、ボールがスタート(除外)からホール(含まれる)まで移動した空きスペースの数によって定義されます。 「u」、「d」、「l

  2. 配列をC++関数に渡す

    C ++では、配列全体を引数として関数に渡すことはできません。ただし、インデックスなしで配列の名前を指定することにより、配列へのポインタを渡すことができます。 1次元配列を関数の引数として渡したい場合は、次の3つの方法のいずれかで関数の仮パラメーターを宣言する必要があります。3つの宣言メソッドはすべて、整数ポインターが実行されることをコンパイラーに通知するため、同様の結果を生成します。受け取る必要があります。 配列を関数に渡す方法は3つあります- ポインタとしての正式なパラメータ void myFunction(int *param) {    // Do so