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,如何依次分割出连续区间,使之在当前数组中的区间平均数最大。期待大神表现~~算法就是伤脑啊~~
不考虑优化的算法:
数组内最大平均数区间算法:
遍历数组,遍历限制区间长度,记下最大的区间平均值的起止index,最终结束的就是最大平均值区间的起止区域,如果数组不符合区间长度限制,则返回起止-1。
拿到第一个起止区域后,分割为前后两个数组,对两个数组递归数组内最大平均数区间算法,最终获得所有最大平均数区间。
伪代码大体是这样:
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); } }
没看明白~~