LeetCode 将数组和减半的最少操作次数
题目地址:https://leetcode.cn/problems/minimum-operations-to-halve-array-sum/description/
给你一个正整数数组 nums 。每一次操作中,你可以从 nums 中选择 任意 一个数并将它减小到 恰好 一半。(注意,在后续操作中你可以对减半过的数继续执行操作)
请你返回将 nums 数组和 至少 减少一半的 最少 操作数。
解题思路:大顶堆
构建大顶堆
把堆顶元素减半,并调整堆,直到数组和减半
func halveArray(nums []int) int {ans := 0var sum float64 = 0size := len(nums)numsFloat := make([]float64, size)for i := 0; i < size; i++ {numsFloat[i] = float64(nums[i])sum += numsFloat[i]}// 构建大顶堆for i := (size - 1) / 2; i >= 0; i-- {heapify(numsFloat, i, size)}// 把堆顶元素减半,并调整堆// 循环此过程,直到 sum 减半halfSum := sum / 2for sum > halfSum {ans++numsFloat[0] = numsFloat[0] / 2sum -= numsFloat[0]heapify(numsFloat, 0, size)}return ans}func heapify(numsFloat []float64, i, size int) {left := i*2 + 1maxChild := leftfor left < size {maxChild = leftif left+1 < size && numsFloat[left+1] > numsFloat[left] {maxChild = left + 1}if numsFloat[maxChild] > numsFloat[i] {swap(numsFloat, maxChild, i)i = maxChildleft = i*2 + 1} else {break}}
}func swap(numsFloat []float64, i, j int) {numsFloat[i], numsFloat[j] = numsFloat[j], numsFloat[i]
}