C ++
 Computer >> コンピューター >  >> プログラミング >> C ++

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

  1. 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 &

  2. 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で返す 理解を深める