C++での最大平均サブアレイII
n個の整数を持つ配列があるとすると、最大平均値を持つk以上の長さの連続するサブ配列を見つける必要があります。最大平均値を見つける必要があります。
したがって、入力が[1,12、-5、-6,50,3]、k =4の場合、長さが5の場合のように、出力は12.75になります。長さが6の場合、最大平均値は10.8です。 、最大平均値は9.16667です。したがって、出力は12.75です。
これを解決するには、次の手順に従います-
-
関数ok()を定義します。これには、x、配列nums、k、
が必要です。 -
n:=numsのサイズ
-
サイズの配列arrを定義します:n。
-
初期化i:=0の場合、i
-
arr [i]:=nums [i]-x
-
-
合計:=0、最後:=0
-
初期化i:=0の場合、i
-
合計:=合計+ arr [i]
-
-
合計>=0の場合、-
-
trueを返す
-
-
初期化i:=0、j:=kの場合、j
-
last:=last + arr [i]
-
合計:=合計+ arr [j]
-
最後の<0の場合、-
-
合計:=合計-最後
-
最後:=0
-
-
合計>=0の場合、-
-
trueを返す
-
-
-
falseを返す
-
メインの方法から、次のようにします-
-
ret:=0、low:=-inf、high:=inf
-
高-低>10^ -5、実行
-
中:=低+(高-低)/ 2
-
ok(mid、nums、k)が真の場合、-
-
低:=中
-
ret:=mid
-
-
それ以外の場合
-
高:=中
-
-
-
retを返す
理解を深めるために、次の実装を見てみましょう-
例
#include <bits/stdc++.h>
using namespace std;
class Solution {
public:
bool ok(double x, vector <int>& nums, int k){
int n = nums.size();
double arr[n];
for (int i = 0; i < n; i++) {
arr[i] = nums[i] - x;
}
double sum = 0;
double last = 0;
for (int i = 0; i < k; i++) {
sum += arr[i];
}
if (sum >= 0)
return true;
for (int i = 0, j = k; j < n; i++, j++) {
last += arr[i];
sum += arr[j];
if (last < 0) {
sum -= last;
last = 0;
}
if (sum >= 0)
return true;
}
return false;
}
double findMaxAverage(vector<int>& nums, int k) {
double ret = 0;
double low = INT_MIN;
double high = INT_MAX;
while (high - low > 1e-5) {
double mid = low + (high - low) / 2;
if (ok(mid, nums, k)) {
low = mid;
ret = mid;
} else {
high = mid;
}
}
return ret;
}
};
main(){
Solution ob;
vector<int> v = {1,12,-5,-6,50,3};
cout << (ob.findMaxAverage(v, 4));
} 入力
{1,12,-5,-6,50,3},4 出力
12.75000
-
C++でのサイズがX以上Y以下のサブアレイの最大平均
問題の説明 配列arr[]と2つの整数XおよびYが与えられます。タスクは、平均が最大で、サイズがX以上Y以下のサブ配列を見つけることです。 例 入力配列が{2、10、15、7、8、4}で、x=3およびY=3の場合、次のように最大平均12.5を取得できます- (10 + 15) / 2 = 12.5 アルゴリズム XからサイズYまでのサイズのすべてのサブアレイを反復処理し、そのようなすべてのサブアレイの中で最大の平均を見つけます。 時間計算量を減らすために、プレフィックス合計配列を使用して、O(1)の複雑さのサブ配列の合計を取得できます 例 例を見てみましょう- #include &
-
Pythonの最大サブアレイ
整数配列Aがあるとします。長さが少なくとも1で、合計が最大である連続したサブ配列を見つけて、その合計を返す必要があります。したがって、配列AがA =[-2,1、-3,4、-1,2,1、-5,4]のようである場合、合計は6になり、サブ配列は[4、-1になります。 、2、1] これを解決するために、動的計画法のアプローチを使用してみます。 Aのサイズと同じ配列dpを定義し、0で埋めます dp [0]:=A [0] for i =1 to the size of A – 1 dp [i]:=最大dp [i – 1] +A[i]およびA[i] 最大値をdpで返す 理解を深める