LeetCode 将数组和减半的最少操作次数

数组和减半的最少操作

题目地址: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]
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值