C ++中的最大平均子数组II

假设我们有一个n个整数的数组,我们必须找到长度大于或等于k且具有最大平均值的连续子数组。我们必须找到最大平均值。

因此,如果输入类似于[1,12,-5,-6,50,3],k = 4,则输出将为12.75,如length为5时,最大值为10.8,length为6时,最大平均值为9.16667。因此输出为12.75。

为了解决这个问题,我们将遵循以下步骤-

  • 定义一个函数ok(),它将使用x,一个数组nums,k,

  • n:= nums的大小

  • 定义大小为n的数组arr。

  • 对于初始化i:= 0,当i <n时,更新(将i增加1),执行-

    • arr [i]:= nums [i]-x

  • sum:= 0,last:= 0

  • 对于初始化i:= 0,当i <k时,更新(将i增加1),执行-

    • sum:= sum + arr [i]

  • 如果总和> = 0,则-

    • 返回真

  • 对于初始化i:= 0,j:= k,当j <n时,更新(i增加1),(j增加1),-

    • 返回真

    • sum:= sum-最后

    • 最后:= 0

    • 最后:=最后+ arr [i]

    • sum:= sum + arr [j]

    • 如果last <0,则-

    • 如果总和> = 0,则-

    • 返回假

    • 从主要方法中执行以下操作-

    • ret:= 0,低:= -inf,高:= inf

    • 当高-低> 10 ^ -5时

      • 高:=中

      • 低:=中

      • ret:=中

      • 中:=低+(高-低)/ 2

      • 如果ok(mid,nums,k)为真,则-

      • 除此以外

      • 返回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 ++中的最大平均子数组II 的全部内容, 来源链接: utcz.com/z/331117.html

      回到顶部