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

C++のユニークな分数


各分数に[分子、分母](分子/分母)が含まれている分数のリストがあるとします。分数の数が-

になるような分数の新しいリストを見つけました
  • 彼らの最も削減された用語で。 (20/14は10/7になります。)

  • (削減後の)重複する分数はすべて削除されます。

  • 実際の値の昇順で並べ替えられています。

  • 数値が負の場合、「-」記号は分子とともに表示されます。

したがって、入力が{{16、8}、{4、2}、{7、3}、{14、6}、{20、4}、{-6、12}}の場合、出力はbe [[-1、2]、[2、1]、[7、3]、[5、1]]

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

  • 1つのセットを定義する

  • n:=vのサイズ

  • 配列を作成するr

  • 初期化i:=0の場合、i

    • c:=gcd of | v [i、0] |および|v[i、1] |

    • v [i、0]:=v [i、0] / c

    • v [i、1]:=v [i、1] / c

    • rの最後に{v[i、0]、v [i、1]}を挿入します

  • 値に基づいて配列rを並べ替えます

  • 配列をretにする

  • 初期化i:=0の場合、i

    • retが空でなく、retの最後の要素がr [i]と同じである場合、-

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

  • retを返す

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

#include <bits/stdc++.h>
using namespace std;
void print_vector(vector<vector<auto>> v) {
   cout << "[";
   for (int i = 0; i < v.size(); i++) {
      cout << "[";
      for (int j = 0; j < v[i].size(); j++) {
         cout << v[i][j] << ", ";
      }
      cout << "],";
   }
   cout << "]" << endl;
}
class Solution {
   public:
   static bool cmp(vector <int>& a, vector <int>& b){
      double aa = (double)a[0] / (double)a[1];
      double bb = (double)b[0] / (double)b[1];
      return aa < bb;
   }
   vector<vector<int>> solve(vector<vector<int>>& v) {
      set < vector <int> > s;
      int n = v.size();
      vector < vector <int> > r;
      for(int i = 0; i < n; i++){
         int c = __gcd(abs(v[i][0]), abs(v[i][1]));
         v[i][0] /= c;
         v[i][1] /= c;
         r.push_back({v[i][0], v[i][1]});
      }
      sort(r.begin(), r.end(), cmp);
      vector < vector <int> > ret;
      for(int i = 0; i < r.size(); i++){
         if(!ret.empty() && ret.back() == r[i]) continue;
         ret.push_back(r[i]);
      }
      return ret;
   }
};
int main(){
   vector<vector<int>> v = {{16, 8},{4, 2},{7, 3},{14, 6},{20, 4},{-
   6, 12}};
   Solution ob;
   print_vector(ob.solve(v));
}

入力

{{16, 8},{4, 2},{7, 3},{14, 6},{20, 4},{-6, 12}}

出力

[[-1, 2, ],[2, 1, ],[7, 3, ],[5, 1, ],]

  1. C++のユニークな二分探索木

    整数nがあるとすると、1からnまでの値を格納する構造的に一意のすべての二分探索木を数える必要があります。したがって、入力が3の場合、ツリーは– になるため、出力は5になります。 これを解決するには、次の手順に従います– サイズn+1の配列を1つ作成します dp [0]:=1 for i:=1からn for j:=0 to i – 1 dp [i]:=dp [i] +(dp [i – 1 – j] * dp [j]) return dp [n] 例(C ++) 理解を深めるために、次の実装を見てみましょう- #include <bits/stdc++.h

  2. C++でのユニークな二分探索木II

    整数nがあるとすると、1からnまでの値を格納する構造的に一意のすべての二分探索木を生成する必要があります。したがって、入力が3の場合、ツリーは-になります。 これを解決するには、次の手順に従います- generate()と呼ばれる1つの再帰関数を定義します。これには、低くても高くてもかまいません。 tempと呼ばれる1つのツリーノードを定義します。 高い場合は、一時にnullを挿入し、一時を返します 低から高の範囲のiの場合 left_subtree:=generate(low、i – 1) right_subtree:=generate(i + 1、high) 現在:=i