サブリストを削除して、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]
- (cntを1減らします)
- delta:=vの最後の要素
- m [v [i]-vの最後の要素]が0または(v [i]-vの最後の要素が0と同じ)に等しくない場合、-
- ans:=最小のansとi --m[v[i]-vの最後の要素]
- m [v [i]]:=i
- 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
-
配列要素の乗算のための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進数を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