其他分享
首页 > 其他分享> > 类型转换坑死人

类型转换坑死人

作者:互联网

起因

上周周赛没写出来第四题2234. 花园的最大总美丽值,这几天找时间用双指针+前缀和的方法写出来了,结果发现77个测试用例能过76个,只有一个死活过不了,差距还挺大。
image

原因

原因就是很简单的溢出错误。在计算前缀和的时候,由于需要计算排序后把前0 ~ i个花园的花的数量增加到第i + 1个的花园的水平所需要的花的数量,因此会有一项needs[i + 1] = flowers[i] * i - sum[i]的问题,其中needssum都是long[],而flowersint[], i毫无疑问也是int,因此就出现了问题:flowers[i]i的范围都可以到\(10^5\),因此flowers[i] * i最大可以到\(10^{10}\),这超出了int的表示范围,结果溢出了。
将这两个强制类型转换为long,问题就解决了。

闲聊

顺便说一句,看题解的时候发现有人用二分法,心想这时间复杂度应该是排序\(O(n \times log(n))\)+计算前缀和\(O(n)\)+查找最优值\(O(log^2(n))\)肯定会比我现在用的排序\(O(n \times log(n))\)+计算前缀和\(O(n)\)+双指针遍历\(O(n)\)的方法更快,结果发现不仅不快,反而更慢了。仔细一看,原来他是遍历第一个指针再用二分法找第二个指针,那么这种方法查找最优值环节的复杂度就提高到了\(O(n\times log(n))\)。。。

标签:类型转换,log,int,前缀,times,flowers,指针
来源: https://www.cnblogs.com/CounterX/p/16141942.html