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) {