leetcode 813. Largest Sum of Averages

这道题题意很简单,不多讲,我的思路就是这样:

题目就是要求我们要将数组分成K部分,那设置一个循环从0到A.size()-K分割(若超过A.size()-K,剩下的部分就不够分成K-1个部分了),想必到这也就很自然的想到了递归调用,对,把A剩下的部分(从i以后)复制给B,此时再求把B分成K-1个部分的最大值即可,求出之后再把前面部分的平均值(就是avg=sum/(i+1))加起来就是最大值了。

但这样提交上去会超时,因为会重复计算,比如说(1,2,3,4,5,6)分成4部分,会有这种情况(1|,2,3|,4,5,6),

(1,2|,3|,4,5,6)两个分支都是要把(4,5,6)分解成两部分,会出现重复求解,所以用一个a[101][101]来保存数据,这个二维数组的行是由A.size()决定,列是由K决定,这样就解决了重复计算问题。

写的不好还请各位大佬指教

class Solution {
public:
    double a[101][101]={0};
    double largestSumOfAverages(vector<int>& A, int K) {
        double maxcount=0,sum=0,avg=0;
        vector<int>B;
        if(a[A.size()][K]!=0)
            maxcount=a[A.size()][K];
        else
        {
        if(K==1)
        {
           for(int i=0;i<A.size();i++)
           {
               sum=sum+A[i];
           }
            maxcount=sum/A.size();
            a[A.size()][K]=maxcount;
        }
        else
        {
            for(int i=0;i<=A.size()-K;i++)
            {
                sum=0;
                for(int k=0;k<=i;k++)
                {
                    sum=sum+A[k];
                }
                B.assign(A.begin()+i+1,A.end());
                avg=sum/(i+1);
                maxcount=max(maxcount,avg+largestSumOfAverages(B,K-1));
                a[A.size()][K]=maxcount;
            }
        }
        }
        return maxcount;
    }
};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值