第一题,我也是暴力超时,我在想用树状数组可以做出来么?但是每次都要找最大值,也许会超时? 第二题,我开始审题错误,最后五分钟想到了一个解法,然鹅没什么卵用,说出来大家看看对不对: 第一遍从头到尾遍历一次,记录元素i之前比它大的最小的一个数的位置dp1[i](有点绕233),如果之前都比他小,则记录它自己的位置,比较的时候需要比较:它自己a[i],它前一个数所记录的dp1[i-1],和它前一个数a[i-1]: if(a[i-1]>a[i]) dp1[i] = i-1; else if(a[i]>a[dp1[i-1]]) dp1[i] = i;(这里我觉得需要严格大于,如果等于的话,应该记录dp[i-1],覆盖范围更广) else dp1[i] = dp[i-1]; 同理,在从尾到头遍历一次,记录元素i后面比它大的最小的一个数的位置dp2[i] 这样的话,通过dp1[i]和dp2[i]能确定以i元素为最大的集合能有多少个,最后再从头到尾遍历一遍计算期望,这样的复杂度是O(3n)?
点赞 评论

相关推荐

程序员牛肉:你这简历有啥值得拷打的?在牛客你这种简历一抓一大把,也就是个人信息不一样而已。 关键要去找亮点,亮点啊,整个简历都跟流水线生产出来的一样。
点赞 评论 收藏
分享
牛客网
牛客网在线编程
牛客网题解
牛客企业服务