类型转换坑死人
作者:互联网
起因
上周周赛没写出来第四题2234. 花园的最大总美丽值,这几天找时间用双指针+前缀和的方法写出来了,结果发现77个测试用例能过76个,只有一个死活过不了,差距还挺大。
原因
原因就是很简单的溢出错误。在计算前缀和的时候,由于需要计算排序后把前0 ~ i
个花园的花的数量增加到第i + 1
个的花园的水平所需要的花的数量,因此会有一项needs[i + 1] = flowers[i] * i - sum[i]
的问题,其中needs
和sum
都是long[]
,而flowers
是int[]
, 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