最大平均值子数组

LintCode

给出一个整数数组,有正有负。找到这样一个子数组,他的长度大于等于 k,且平均值最大。

二分平均值,平均值的上限r是单个最大值,下限l是所有数的和.

mid=(l+r)/2

设sum[i]=nums[0]+nums[1]+nums[2]...nums[i]-i*mid;

保存m=min(sum[0],sum[1],sum[2]...sum[i-k+1].

如果发现sum[i]>m,说明在num[i-k+1]到num[i]之间的数,平均值大于mid.所以sum才能上涨.

class Solution {
public:
    double search(vector<int>&nums, int k, double mid) {
        vector<double> sum(nums.size() + 1);
        double min = 0;
        for (int i = 1; i <= nums.size(); i++) {
            sum[i] = sum[i - 1] + (double)nums[i - 1] - mid;
            if (i >= k && sum[i] >= min)
                return true;
            if (i >= k)
                min = ::min(min, sum[i - k + 1]);
        }
        return false;
    }
    double maxAverage(vector<int>& nums, int k) {
        vector<int> sum(nums.size());
        sum[0] = nums[0];
        for (int i = 1; i < nums.size(); i++)
            sum[i] = sum[i - 1] + nums[i];
        double l = (double)sum.back() / nums.size(), r = *max_element(nums.begin(), nums.end());
        while (r - l > 1e-6) {
            double mid = (l + r) / 2.0;
            if (search(nums, k, mid))
                l = mid;
            else
                r = mid;
        }
        return r;
    }
};
时间: 2024-10-10 11:18:36

最大平均值子数组的相关文章

找出一个整数数组的和最大的连续子数组

题目: 给任意一个整数数组,找出这个数组的和最大的连续子数组(子数组的和最大且子数组连续).要求:算法的时间复杂度为O(n). 程序设计思想: 1:用maxValue记录当前连续子数组和为最大的和的值,初始化其值为:maxValue=a[0].注:记数组为a[n]. 2:这个过程总的思想就是,从数组头开始往后,每次加进一个值,它们的和记为tempValue,若tempValue比新加进来的数值本身要小,应该从这个位置开始重新开始计算tempValue的值.而每次的tempValue都应该和max

最长可整合子数组

可整合子数组:按由小到大排完序之后,后面的数比前一个数大1,如:[2,4,3,6,5]就是可整合数组. 1 // getLiL.cpp : 定义控制台应用程序的入口点. 2 // 3 4 #include "stdafx.h" 5 #include <iostream> 6 #include <hash_set> 7 #include <iterator> 8 #include <set> 9 10 using namespace std

求一个数组中和最小的连续子数组

#include<stdio.h> #define MAX_LENGTH 10 int main() { int a[MAX_LENGTH]={1,2,3,-2,4,-6,-8,5,3,1}; int i,j,beg,end,tmp,min=0x7fffffff; //beg和end分别为子数组中首末元素下标,min为无穷大的数 beg=end=tmp=0; for(i=0;i<MAX_LENGTH;++i) { tmp=a[i]; for(j=i+1;j<MAX_LENGTH;+

求二维数组中子数组和中最大的值,及子数组

求二维数组中子数组和中最大的值,及子数组 个人信息:就读于燕大本科软件工程专业 目前大三; 本人博客:google搜索"cqs_2012"即可; 个人爱好:酷爱数据结构和算法,希望将来从事算法工作为人民作出自己的贡献; 编程语言:C++ ; 编程坏境:Windows 7 专业版 x64; 编程工具:vs2008; 制图工具:office 2010 powerpoint; 硬件信息:7G-3 笔记本; 真言 每次着急写程序,碰到问题就头疼,头疼之后便是满满的收获,付出总有回报. 题目 求

最大和子数组

最大和子数组问题 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 13 -3 -25 20 -3 -16 -23 18 20 -7 12 -5 -22 15 -4 7 求这个数组中子数组的最大和. 分治法的思想: 我们来思考如何用分治法来求解最大子数组问题.假定我们要寻找子数组A[low,...,high]的最大子数组.使用分治技术,意味着我们要将子数组划分为两个规模尽量相等的子数组.也就是说,找到子数组的中央位置,比如mid,然后考虑求解两个子数组A[low,..

[LeetCode] Shortest Unsorted Continuous Subarray 最短无序连续子数组

Given an integer array, you need to find one continuous subarray that if you only sort this subarray in ascending order, then the whole array will be sorted in ascending order, too. You need to find the shortest such subarray and output its length. E

用reduce装逼 之 多个数组中得出公共子数组,统计数组元素出现次数

昨天做了一道美团的面试题,要求是给N个数组,找出N个数组的公共子数组. var a = [7,2,3,4,5]; var b = [4,2,3,7,6]; var c = [2,3,3,3,7]; var d = [4,2,3,8,7]; 以上四个数组,有公共子数组2, 3,7 function main(){ var result = []; var arr = arguments[0]; for(var i=1 ; i<arguments.length ; i++){ var arr = a

(算法)和为0的最大连续子数组

题目: 和为零的最大连续子数组 思路: 我首先想到的是前缀数组和,遍历一遍数组,计算出sum[i](表示从0-i的子数组之和). 有了前缀数组和,只要sum[i]=sum[j](i<j),那么区间[i+1,j]就是和为零的子数组,只要在遍历前缀数组和时记录最长的区间即可. 需要注意的是:当sum[i]等于0时,其区间为[0,i]. 在判断sum[i]=sum[j](i<j)时,有个查找的过程,要么直接遍历j左边的所有数(增加时间复杂度),要么通过map来存储对应和的下标位置(空间换时间).(详

LeetCode 53. Maximum Subarray(最大的子数组)

Find the contiguous subarray within an array (containing at least one number) which has the largest sum. For example, given the array [-2,1,-3,4,-1,2,1,-5,4],the contiguous subarray [4,-1,2,1] has the largest sum = 6. click to show more practice. Mor