C++での最大ギャップ
ソートされていない配列があるとします。ソートされた形式で、連続する要素間の最大の違いを見つける必要があります。配列に含まれる要素が2つ未満の場合は、0を返します。したがって、配列が[12,3,9,1,17]の場合、並べ替えられた配列は[1,3,9,12,17]になるため、出力は6になり、5が最大差になります。 3と9の差は6です。
これを解決するには、次の手順に従います-
-
minVal:=inf、maxCal:=-inf
-
n:=numsのサイズ
-
n <2の場合、0を返します;
-
0からn– 1 −
の範囲のiの場合-
minVal:=nums[i]とminValの最小値
-
maxVal:=nums[i]とmaxValの最大値
-
-
ギャップ:=maxVal – minVal / n –1のセリング
-
サイズn– 1のbucketMaxという1つの配列を作成し、これに–inf
を入力します。 -
サイズn– 1のbucketMinという1つの配列を作成し、これにinfを入力します
-
0からn– 1 −
の範囲のiの場合-
x:=nums [i]
-
x=minValまたはx=maxValの場合、次の部分をスキップして、次の反復に進みます
-
idx:=(nums [i] – minVal)/gap。
-
bucketMax [idx]:=bucketMax[idx]とnums[i]
の最大値 -
bucketMin [idx]:=bucketMin[idx]とnums[i]
の最小値
-
-
ret:=0
-
prev:=minVal
-
0からn–1の範囲のiの場合
-
bucketMax [i]=-infおよびbucketMin[i]=infの場合、次の部分をスキップして、次の反復に進みます
-
ret:=retとbucketMin[i]の最大値– prev
-
前:=bucketMax [i]
-
-
retの最大値を返す、maxVal-prev
例
理解を深めるために、次の実装を見てみましょう-
#include <bits/stdc++.h> using namespace std; typedef long long int lli; class Solution { public: int maximumGap(vector<int>& nums) { lli minVal = INT_MAX; lli maxVal = INT_MIN; int n = nums.size(); if(n < 2) return 0; for(int i = 0; i < n; i++){ minVal = min((lli)nums[i], minVal); maxVal = max((lli)nums[i], maxVal); } int gap = ceil((double)(maxVal - minVal) / (double)(n - 1)); vector <int> bucketMax(n - 1, INT_MIN); vector <int> bucketMin(n - 1, INT_MAX); for(int i = 0; i < n; i++){ int x = nums[i]; if(x == minVal || x == maxVal) continue; int idx = (nums[i] - minVal) / gap; bucketMax[idx] = max(bucketMax[idx], nums[i]); bucketMin[idx] = min(bucketMin[idx], nums[i]); } lli ret = 0; lli prev = minVal; for(int i = 0; i < n - 1; i++){ if(bucketMax[i] == INT_MIN && bucketMin[i] == INT_MAX) continue; ret = max(ret, bucketMin[i] - prev); prev = bucketMax[i]; } return max(ret, maxVal - prev); } }; main(){ Solution ob; vector<int> v = {12,3,9,1,17}; cout << (ob.maximumGap(v)); }
入力
[12,3,9,1,17]
出力
6
-
C++での最大幅ランプ
整数の配列Aがあるとすると、ランプはi
-
C++での四辺形の最大面積
問題の説明 四辺形a、b、c、dの4つの辺が与えられた場合、与えられた辺から可能な四辺形の最大面積を見つけます。 アルゴリズム 以下のブラーマグプタの公式を使用して、この問題を解決できます- √(s-a)(s-b)(s-c)(s-d) 上記の式では、sは半周長です。次のように計算されます- S =(a + b + c + d)/ 2 例 例を見てみましょう- #include <bits/stdc++.h> using namespace std; double getMaxArea(double a, double b, double c, double d) {