首页新闻找找看学习计划

一个关于数组分割的算法

0
悬赏园豆:50 [已解决问题] 解决于 2014-04-24 09:37

1、假设有一个数组全部为正数,arr[7]={6,9,12,3,14,4,12}。现在要找到一个连续区间,区间长度限制为2~4,使得区间内的平均数最大。
2、照此对数组进行分割。分割后的数组,任然要保持连续,剔除小于区间长度限制的区间。
3、按此可将arr进行分割,首先为区间【9,12】平均数为10.5。剩下数组为{3,14,4,12},因为“6”所在区间,区间长度只为1,且与后面的数字不连续,故对“6”进行剔除。然后分割出区间【14,4,9】平均数为10。所以最后结果就将数组分割为【9,12】和【14,4,12】
4、现有数组arr[1000]限制区间长度为10~18,如何依次分割出连续区间,使之在当前数组中的区间平均数最大。期待大神表现~~算法就是伤脑啊~~

码王的主页 码王 | 初学一级 | 园豆:161
提问于:2014-04-22 17:23
< >
分享
最佳答案
0

不考虑优化的算法:

数组内最大平均数区间算法:

遍历数组,遍历限制区间长度,记下最大的区间平均值的起止index,最终结束的就是最大平均值区间的起止区域,如果数组不符合区间长度限制,则返回起止-1。

拿到第一个起止区域后,分割为前后两个数组,对两个数组递归数组内最大平均数区间算法,最终获得所有最大平均数区间。

收获园豆:50
hailants | 小虾三级 |园豆:750 | 2014-04-22 21:57

伪代码大体是这样:

struct AverageArea
{
    int start;
    int end;
    float average;
}
void GetMaxAverageArea(int[] arr,int minLength,int maxLength,list<AverageArea> resultList)
{
    AverageArea maxAverageArea;
    for(int i=minLength;i<=maxLength;i++)
    {
        for(int j=0;j<arr.Length-i;j++)
        {
            int sum=0;
            for (int k=0;k<i;k++)
            {
                sum+=arr[j+k];
            }
            float newaverage=sum/i;
            if(maxAverageArea.average<newaverage)
            {
                maxAverageArea.start=j;
                maxAverageArea.end=j+i;
                maxAverageArea.average=newaverage;
            }
        }
    }
    if(maxAverageArea>0)
    {
        resultList.add(maxAverageArea);
        GetMaxAverageArea(subarray(arr,0,maxAverageArea.start),minLength,maxLength, resultList);
        GetMaxAverageArea(subarray(arr,maxAverageArea.end,arr.length-1),minLength,maxLength, resultList);
    }
}

 

hailants | 园豆:750 (小虾三级) | 2014-04-22 22:09
其他回答(1)
0

没看明白~~

FortuneGril | 园豆:300 (菜鸟二级) | 2014-04-22 17:40
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册