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

サブリストを削除して、C++でkの上下に同じ数の要素を取得するプログラム


numsと呼ばれる番号のリストと別の番号kがあるとすると、リストからサブリストを最大1回削除できます。結果として得られる最長のリストの長さを、厳密にkより小さく厳密にkより大きい数の量が同じになるように見つける必要があります。

したがって、入力がnums =[6、10、8、9、3、5]、k =6の場合、サブリスト[9]を削除した場合と同様に、出力は5になり、[6、 10、8、3、5]であり、6よりも小さい2つの数値[3、5]と6よりも大きい2つの数値[10、8]があります。

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

  • nums + 1と同じサイズの配列vを定義し、0で埋めます
  • cnt:=0
  • iを初期化する場合:=0、i
  • nums [i]
  • (cntを1増やします)
  • それ以外の場合、nums [i]> kの場合、次のようになります。
    • (cntを1減らします)
  • v [i + 1] =cnt
  • vの最後の要素が0の場合、numsのサイズを返します
    • delta:=vの最後の要素
  • 1つのマップを定義するm
  • ans:=無限大
  • iを初期化する場合:=1、i <=vのサイズの場合、更新(iを1増やします)、実行-
    • m [v [i]-vの最後の要素]が0または(v [i]-vの最後の要素が0と同じ)に等しくない場合、-
      • ans:=最小のansとi --m[v[i]-vの最後の要素]
    • m [v [i]]:=i
  • ansが無限大と同じ場合、-
    • 0を返す
  • それ以外の場合
    • numsのサイズを返す
  • 理解を深めるために、次の実装を見てみましょう-

    #include <bits/stdc++.h>
    using namespace std;
    class Solution {
    public:
       int solve(vector<int>& nums, int k) {
          vector<int> v(nums.size() + 1, 0);
          int cnt = 0;
          for (int i = 0; i < nums.size(); ++i) {
             if (nums[i] < k)
                ++cnt;
             else if (nums[i] > k)
                --cnt;
             v[i + 1] = cnt;
          }
          if (v.back() == 0) return int(nums.size());
          int delta = v.back();
          map<int, int> m;
          int ans = INT_MAX;
          for (int i = 1; i <= v.size(); ++i) {
             if (m[v[i] - v.back()] != 0 || v[i] - v.back() == 0) {
                ans = min(ans, i - m[v[i] - v.back()]);
             }
             m[v[i]] = i;
          }
          if (ans == INT_MAX)
             return 0;
          else
             return int(nums.size() - ans);
       }
    };
    main(){
       Solution ob;
       vector<int> v = {6, 10, 8, 9, 3, 5};
       int k = 6;
       cout << ob.solve(v, k); }

    入力

    {6, 10, 8, 9, 3, 5}, 6

    出力

    5

    1. 配列要素の乗算のためのC++プログラム

      整数要素の配列で与えられ、タスクは配列の要素を乗算して表示することです。 例 Input-: arr[]={1,2,3,4,5,6,7} Output-: 1 x 2 x 3 x 4 x 5 x 6 x 7 = 5040 Input-: arr[]={3, 4,6, 2, 7, 8, 4} Output-: 3 x 4 x 6 x 2 x 7 x 8 x 4 = 32256 以下のプログラムで使用されるアプローチは次のとおりです − 一時変数を初期化して、最終結果を1で格納します ループを0からnまで開始します。nは配列のサイズです 最終結果を得るには、tempの値にarr[i]を掛け続

    2. 2進数を8進数に、またはその逆に変換するC++プログラム

      コンピューターシステムでは、2進数は2進数で表され、8進数は8進数で表されます。 2進数は基数2で、8進数は基数8です。 2進数とそれに対応する8進数の例は次のとおりです- 2進数 8進数 01010 12 00111 7 11001 31 10000 20 2進数を8進数に変換し、8進数を2進数に変換するプログラムは次のとおりです- 例 #include <iostream> #include <cmath> using namespace std; int BinarytoOctal(int binar