644. Maximum Average Subarray II

来源:互联网 发布:总统和主席的区别知乎 编辑:程序博客网 时间:2024/06/06 11:41

644 Maximum Average Subarray II
Given an array consisting of n integers, find the contiguous subarray whose length is greater than or equal to k that has the maximum average value. And you need to output the maximum average value.

Example 1:
Input: [1,12,-5,-6,50,3], k = 4
Output: 12.75
Explanation:
when length is 5, maximum average value is 10.8,
when length is 6, maximum average value is 9.16667.
Thus return 12.75.

问题描述:
给出一个无序的数组,找出其中连续的子序列,使得其中的平均值最大,其中规定了子序列的长度必须大于等于k。
输出最大平均值。

思路:
一、先放个图:
这里写图片描述

先计算到数组前k个数之和。
然后,在计算前k+i个数之和U时候,还需要计算前i个数之和S,并将其中最小值用min记录下来。
那么,前k+i个数中子序列中最大值就是U-min。

·然后……
大神的思路是加上2个double类型的数,初始值为-10000和10000。
此时两个数之和平均值为0。
之后我们会不断调整这两个数的值,直到这两个数与 数组中所求的子序列最大平均值相等才停止。

初始:-10000 和 10000 平均值 0
我们把平均值0传进去,然后看看进入一函数,这个函数就是上面计算 该数组长度大于等于k的子序列最大值 的函数,看看 其中函数运行过程中会不会出现比平均值0大的子序列,如果大了,说明传进去的-10000改为平均值,如果算到数组最后一个数还是不大于,那么就10000改为0.
然后 0和10000 或者 -10000和0 平均值 5000 或 -5000
……
一直循环到 传进去的两数相等(对于double类型是 <0.4e-5)

class Solution {public:    double findMaxAverage(vector<int>& nums, int k) {        double l=-10000,r=10000,mid;        vector<double> b(nums.size()); //min[i]记录前i个数中子序列(0~k,其中k<=i)之和最小的值        while(r-l>0.4e-5)        {            mid=(l+r)/2;            bool u=false;            double sum=0.0;            double y=0;            for(int i=0;i<nums.size();++i)            {                sum=sum+nums[i];                y = sum -(i+1)*mid;                if(i+1>=k &&  y > (i+1>k? b[i-k] : 0))                {                    u =true;                    break;                }                if(i==0)                {                    b[i]=min(y,0.0);                }                else                {                    b[i]=min(y,b[i-1]);                }            }            if(u) l=mid;            else  r=mid;        }        return (l+r)/2;    }};
原创粉丝点击