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

被折叠的 条评论
为什么被折叠?



