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

C++で配列サイズを半分に減らします


配列arrがあるとします。整数のセットを選択して、配列内のこれらの整数のすべての出現を削除できます。配列の整数の少なくとも半分が削除されるように、セットの最小サイズを見つける必要があります。したがって、たとえば、arr =[3,3,3,3,5,5,5,2,2,7]の場合、出力は2になります。これは、{3,7}を選択すると次のようになるためです。サイズ5の新しい配列[5,5,5,2,2](これは古い配列のサイズの半分に相当します)。サイズ2の可能なセットは、{3,5}、{3,2}、{5,2}です。セット{2,7}を選択すると、古い配列の半分のサイズの新しい配列[3,3,3,3,5,5,5]が作成されるため、選択できません。

>

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

  • マップm、n:=arrのサイズを定義し、arrに存在する各要素の頻度をマップmに格納します

  • temp、sz:=n、およびret:=0と呼ばれる配列を定義します

  • キーと値のペアごとに、m

    • その値をtempに挿入します

  • 一時配列を並べ替える

  • 0からtempのサイズまでの範囲のIの場合

    • sz <=n / 2の場合、ループから抜けます

    • retを1増やします

    • szをtemp[i]

      だけ減らします
  • retを返す

例(C ++)

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

#include <bits/stdc++.h>
using namespace std;
class Solution {
public:
   int minSetSize(vector<int>& arr) {
      unordered_map <int, int> m;
      int n = arr.size();
      for(int i = 0; i < n; i++){
         m[arr[i]]++;
      }
      vector <int> temp;
      unordered_map <int, int> :: iterator it = m.begin();
      int sz = n;
      int ret = 0;
      while(it != m.end()){
         temp.push_back(it->second);
         it++;
      }
      sort(temp.rbegin(), temp.rend());
      for(int i = 0; i < temp.size(); i++){
         if(sz <= n / 2)break;
         ret++;
         sz -= temp[i];
      }
      return ret;
   }
};
main(){
   vector<int> v = {3,3,3,3,5,5,5,2,2,7};
   Solution ob;
   cout << (ob.minSetSize(v));
}

入力

[3,3,3,3,5,5,5,2,2,7]

出力

2

  1. 画像ファイルのサイズを小さくする方法

    以前、エクスプローラーの組み込みのメールオプションを使用するか、Windows用のImage Resizerと呼ばれるデスクトッププログラムを使用して、画像ファイルのサイズを縮小する方法についての記事を書きました。これらは良いオプションですが、画像を最適化する方法は他にもいくつかあります。また、多くのWebサイトでペイントを使用するように指示されていますが、画像の見栄えが非常に悪いため、ペイントは適切な方法ではないことがわかりました。 まず、画像のサイズを縮小するために使用されるいくつかの方法では、画像の品質が低下することを理解することが重要です。これは、Webサイトでは問題ない場合がありま

  2. C++の迷路

    空のスペースと壁のある迷路の中にボールがあるとします。これで、ボールは上、下、左、右などの任意の方向に転がることで空のパスを通過できますが、壁にぶつかるまで転がりが止まりません。ボールが止まると、次の方向を選択できます。 ボールの位置、目的地、迷路を開始し、ボールが目的地に止まるかどうかを確認する必要があります。迷路は1つの2D配列で表されます。ここで、1は壁を示し、0は空きスペースを示します。迷路の境界はすべて壁です。開始座標と宛先座標は、行と列のインデックスで表されます。 したがって、入力が2D配列で表される迷路のようなものである場合 0 0 1 0 0