欢迎光临散文网 会员登陆 & 注册

难受的一天从和正确答案擦肩而过开始

2021-10-21 13:46 作者:スレーブ_スレイヤー  | 我要投稿

LeetCode 453

给你一个长度为 n 的整数数组,每次操作将会使 n - 1 个元素增加 1 。返回让数组所有元素相等的最小操作次数。

第一次看到题目的时候,我最大的疑问是怎么保证操作次数最少,然后想到了让最小的数加到和第二小的数的一样大,然后让第二小的数加到和第三小的数一样大,直到相等,记录总次数......这是直觉上的方案,所以我还是不敢相信这样就是最少的步骤,就像动态规划那个经典题目里,让你用5 7 2 三种面值的钱凑27块一样,直觉上是先用大面值但结果并不是最少。

但提交了一下居然直接通过了。

我还写了注释来模拟步骤,后面的3 4 5 8就是前一个数字要和后一个数字一样大,需要加的次数。虽然通过了,但内存和速度惨不忍睹,于是我觉得一定有更简单的方法,然后开始看注释,想找出那四个数字和数组之间有没有什么规律......

结论是,没有。然后我开始换思路,我觉得是排序拖慢了我的速度,就想着怎么能避免排序......没想出来。

然后去看了一眼官方题解,一个残酷的事实摆在我的面前:

只需要计算每个数和最小值的差值,然后把它们相加就行了。

我看了一眼自己的代码,我做的实际上就是这件事,只不过我根本没意识到这些数字都是和最小值的差值!我把3 4 5 8 这四个差值都写出来了,却完全没发现它就是差值,只是把它当作前一个数要和后一个数相等需要加的次数......

可以利用“相对论”,把所有数+1视为一个数-1,这种类似脑筋急转弯的思路没想到很正常。但这四个值是每个数和最小值的差值,这件事应该是可以发现的。

正确答案摆在我的面前,我都没发现这是答案......我现在就和钻1晋级赛渡劫局,还差一下就能把对面水晶a爆,结果掉线连上以后发现自家水晶爆了一样难受。




难受的一天从和正确答案擦肩而过开始的评论 (共 条)

分享到微博请遵守国家法律