配列をC++のK個の連続した数値のセットに分割します
整数numsと正の整数kの配列があるとすると、この配列をk個の連続した数のセットに分割できるかどうかを調べる必要があります。したがって、可能であればTrueを返す必要があり、そうでない場合はFalseを返す必要があります。したがって、入力が[1,2,3,3,4,4,5,6]のようで、k =4の場合、出力はtrueになります。これは、[1,2,3,4]と[3,4,5,6]
のように配列を分割できるためです。これを解決するには、次の手順に従います-
- 1つのマップmを作成し、n:=nums配列のサイズを設定します
- numsの各要素eについて
- m[e]を1増やします
- cnt:=0
- 並べ替えnums配列
- 0からnの範囲のiの場合
- x:=nums [i]
- m [x – 1]=0かつm[x]>0
- の場合
- l:=k
- while k> 0
- m [x]> 0の場合、m [k]の値を1減らし、それ以外の場合はfalseを返します
- xとcntを1増やし、kを1減らします
- k:=l
- cnt =nの場合はtrueを返し、それ以外の場合はfalseを返します
理解を深めるために、次の実装を見てみましょう-
例
#include <bits/stdc++.h> using namespace std; class Solution { public: bool isPossibleDivide(vector<int>& nums, int k) { map <int, int> m; int n = nums.size(); for(int i = 0; i < n; i++){ m[nums[i]]++; } int cnt = 0; sort(nums.begin(), nums.end()); for(int i = 0; i < n; i++){ int x = nums[i]; if(m[x - 1] == 0 && m[x] > 0){ int l = k; while(k>0){ if(m[x] > 0){ m[x]--; } else return false; x++; k--; cnt++; } k = l; } } return cnt == n; } }; main(){ vector<int> v = {1,2,3,3,4,4,5,6}; Solution ob; cout << (ob.isPossibleDivide(v, 4)); }
入力
[1,2,3,3,4,4,5,6] 4
出力
1
-
C ++のバイナリ循環配列の最大連続1(またはゼロ)
循環配列が与えられます。循環配列は、最初の要素が最後の要素の隣にある場合を考慮した配列です。キューを実装するために使用されます。したがって、最大数を数える必要があります。その配列内の連続する1または0の数。 例を挙げて理解しましょう。 入力 − arr [] ={1,1,0,1,0,1,0,1,1,1} 出力 −最大連続1は5です。または最大連続0は1です。 説明 − Arr []インデックス7から9まで、次にインデックス0と1。1は5です。連続する0はありませんが、1です。 入力 − arr [] ={0,0,0,1,0} 出力 −最大連続1は1です。または、連続する最大0は
-
C++の配列内のすべての素数の積
いくつかの要素を持つ整数配列arr[]が与えられた場合、タスクはその数のすべての素数の積を見つけることです。 素数は、1で割った数、またはその数自体です。または、素数は、1とその数自体を除いて他の数で割り切れない数です。 1、2、3、5、7、11など 与えられた配列の解を見つける必要があります- 入力 −arr [] ={11、20、31、4、5、6、70} 出力 − 1705 説明 −配列の素数は− 11、31、5であり、それらの積は1705 入力 − arr [] ={1、2、3、4、5、6、7} 出力 − 210 説明 −配列の素数は− 1、2、3、5、7