2024-03-16:用 go 语言,给你一个正整数数组 nums, 每一次操作中,你可以从 nums 中选择 任意 一个数并将它减小到 恰好 一半。 (注意,在后续操作中你可以对减半过的数继续执行操作)
2024-03-16:用 go 语言,给你一个正整数数组 nums,
每一次操作中,你可以从 nums 中选择 任意 一个数并将它减小到 恰好 一半。
(注意,在后续操作中你可以对减半过的数继续执行操作)
请你返回将 nums 数组和 至少 减少一半的 最少 操作数。
输入:nums = [5,19,8,1]。
输出:3。
答案 2024-03-16:
来自左程云。
大体步骤如下:
1.定义一个优先队列(PriorityQueue)来存储数组中的数字,优先级为数字的倒数。
2.计算数组中所有数字的和,并将和除以 2 得到目标值(sum)。
3.初始化操作次数(ans)为 0,初始化当前减半的数值之和(minus)为 0。
4.循环直到当前减半的数值之和(minus)大于等于目标值(sum):
弹出优先队列中最大的数值(cur)。
将弹出的数值除以 2 得到新的数值(cur/2)。
将新的数值添加回优先队列中。
更新操作次数(ans)加 1。
更新当前减半的数值之和(minus)加上新的数值(cur/2)。
5.返回操作次数(ans)作为结果。
总的时间复杂度为 O(nlogn),其中 n 为数组的长度。堆操作的时间复杂度为 O(logn)。
总的额外空间复杂度为 O(n),需要额外的优先队列来存储数组中的数字。
Go 完整代码如下:
复制代码
Python 完整代码如下:
复制代码
版权声明: 本文为 InfoQ 作者【福大大架构师每日一题】的原创文章。
原文链接:【http://xie.infoq.cn/article/2844b3877898677df85bebe1e】。
本文遵守【CC-BY 4.0】协议,转载请保留原文出处及本版权声明。
评论