米哈游 9.24 java笔试
单选题和多选题难度还可以;
算法题第三道我还是卡在了双循环超时上![](https://uploadfiles.nowcoder.com/images/20220815/318889480_1660553763930/8B36D115CE5468E380708713273FEF43)
对于一个一维数组
有没有佬能指点一下,这种双循环该怎么优化以避免超时呢?
算法题第三道我还是卡在了双循环超时上
对于一个一维数组
有没有佬能指点一下,这种双循环该怎么优化以避免超时呢?
全部评论
就是算1*a[i-1]+2*a[i-2]+....+i-1*a[1]再乘上a[i]就可以啦
合并一下同类项就可以a1(a2+2a3+3a4+…)
就是j*aj的和乘ai,然后因为每层计算前面的j会-1,所以每次计算前给他减掉i后面所有数的sum就出来了
这样步步mod就可以保证不溢出了
开辟两个数组b和c,数组b遍历一次k*a[k]+b[k-1],数组c遍历一边a[k]+c[k-1],最后求和res+=a[k]*(b[k]-k*c[k]),应该是这么解的吧(还有些细节0应该手动初始化,k从1开始)
可以把sum[i-1]和t[i-1]换成一个变量存储,也能节省一些空间
int n = in.nextInt();
int[] a = new int[n+1];
long[] sum = new int[n+1];//存前缀和
sum[0]=0;
long[] t = new int[n+1];
t[0]=0;
long res;
for(int i=1;i<=n;i++){
a[i]=in.nextInt();
sum[i]=sum[i-1]+a[i];
t[i]=t[i-1]+sum[i-1];
long tmp = (t[i]*a[i])%1000000007;
res = (res+tmp)%1000000007;
}
蹲 我也是![](https://uploadfiles.nowcoder.com/images/20220815/318889480_1660553763930/8B36D115CE5468E380708713273FEF43)
试了分治还是超时...
蹲,感觉是数学公式推导,能在O(n)算完
我想出来了后缀和的方法,但是结果错误
,不知道哪搞错了
为啥我这种后缀和的方法不超时但是还是只能过20啊,result和result2我自验证是一样的![](https://uploadfiles.nowcoder.com/images/20220815/318889480_1660553763930/8B36D115CE5468E380708713273FEF43)
只用单层循环即可,首先你需要记录前缀和。然后第二次计算的时候,需要有一个变量,每次只需要计算临时变量*arr【i】就行,这个临时变量每次循环后+第i个前缀和。
前缀和20%,改long long70%
一样的循环 超时过20
众安保险投了没,众安科技投了没,500强工资高,流程刚开始,保险公司可老有钱了~![](https://uploadfiles.nowcoder.com/images/20220815/318889480_1660553763434/7A0C3C39D0D8037360A2B600921D52C5)
https://app.mokahr.com/m/campus_apply/zhongan/71908?recommendCode=DS5jTXpa#/jobs
相关推荐
![](https://static.nowcoder.com/fe/file/oss/icon_job.png)
点赞 评论 收藏
分享