Lintcode 617:Maximum Average Subarray
来源:互联网 发布:mac vim不保存退出 编辑:程序博客网 时间:2024/05/20 16:42
一开始用了最简单的遍历循环法,时间复杂度为O(N^2),然后被提醒超时,上网查了之后做了一个小改动,用一个sum数组存储num[0]到num[i]的总和,这样算num[i]到num[j] 只要算sum[j]-sum[i]就好了。
这个想法的代码如下:
class Solution {public: /** * @param nums an array with positive and negative numbers * @param k an integer * @return the maximum average */ double maxAverage(vector<int>& nums, int k){ double result; int i,j,num; int vectorLength=nums.size(); double tmp[vectorLength]; tmp[0]=0; for(i=1;i<vectorLength+1;i++){ tmp[i]=tmp[i-1]+nums[i-1]; } result=tmp[vectorLength]/vectorLength; for(j=vectorLength;j>=k;j--){ for(i=0;i<vectorLength-k+1;i++){ if(j-i>=k&&(tmp[j]-tmp[i])/(j-i)>result) result=(tmp[j]-tmp[i])/(j-i); else if(j-i<k) break; } } return result; }};
但是lintcode还是提醒超时,网上继续找找到了这个。提示用二分搜索法做。
http://stackoverflow.com/questions/13093602/finding-subarray-with-maximum-sum-number-of-elements
实现代码在这里:
http://www.jiuzhang.com/solutions/maximum-average-subarray/
个人理解:
1、一个数组的子数组的最大平均数一定在数组的最大值和最小值之间,所以二分法的第一步限定average位于[min,max]之中。
2、接下去要做的就是不断的缩小范围,直至max-min足够小(如1e-6),那我们就得到了想要的结果。
缩小范围的思想如下:
每一轮设置mid=(min+max)/2,然后将原数组中的每一个数减去这个mid,如果能找到(经过提醒,改正为:大于等于)k个相邻数的总和大于0的情况,那么说明最终结果一定比这个mid要更大,限定下一轮寻找范围在[mid,max]之中。反之在限定在[min,mid]之中。
那么在实际算法中我们需要解决的关键一步就是,如何判断“有(大于等于)k个相邻数的总和大于0的情况存在”。
首先,我们可以用sum数组来存储减掉mid值的原数组的各总和(sum[i]存储num[0]-mid到num[i-1]-mid的总和),当sum[i]存储的总和个数超过k时(即i>k),也就是说我们保证了这个子数组的长度达到k后,可以砍掉之前一些拖后腿的数。这些拖后腿的数在上述链接的代码中是用min_pre来实现的。当之前拖后腿的数值小于min_pre时,更新min_pre=sum[i - k + 1]。sum[i]存储的是num[0]~num[i-1]减去mid的总和,而min_pre存储的是num[0]~num[k]减掉mid的总和,这样sum[i]-min_pre得到的是sum[k+1]~sum[i-1],它所记录的总和个数也就是到num[i]为止能够找到的最大平均数 子数组的长度。
- Lintcode 617:Maximum Average Subarray
- [LintCode]Maximum Average Subarray
- lintcode——maximum average subarray
- Maximum Average Subarray I
- Lintcode - Maximum Subarray II
- Lintcode - Maximum Subarray Difference
- Lintcode - Maximum Subarray III
- [LintCode]Maximum Subarray Difference
- [Lintcode]Maximum Subarray
- LintCode:Maximum Subarray III
- lintcode: Maximum Subarray
- lintcode: Maximum Product Subarray
- [LintCode]Maximum Subarray Difference
- [LintCode]Maximum Subarray III
- Maximum Product Subarray--lintcode
- 644. Maximum Average Subarray II
- 644. Maximum Average Subarray II
- 643. Maximum Average Subarray I
- lua基础算法
- 9 Linux rm
- [Java/C++] static 关键词的使用
- “允许源文件与模块生成文件不同” 解决方法 ,亲测最有效的
- java面试题(3)-网路通讯部分
- Lintcode 617:Maximum Average Subarray
- display:inline、block、inline-block的区别
- 17-02-04
- 442. Find All Duplicates in an Array
- Elastic-Job
- 《数学之美》(吴军)小记
- Java编程题练习2017-02-21
- 按住图片两秒,弹出保存框之类的实现(NGUI)
- 网桥和中继器