写点什么

2024-08-21:用 go 语言,给定一个从 0 开始索引的整数数组 nums 和一个整数 k,请设计一个算法来使得数组中的所有元素都大于或等于 k,返回所需的最少操作次数。 每次操作可以执行以下步骤

  • 2024-08-21
    北京
  • 本文字数:1257 字

    阅读完需:约 4 分钟

2024-08-21:用 go 语言,给定一个从 0 开始索引的整数数组 nums 和一个整数 k,请设计一个算法来使得数组中的所有元素都大于或等于 k,返回所需的最少操作次数。


每次操作可以执行以下步骤:


1.选择数组中最小的两个整数 x 和 y。


2.从数组中删除 x 和 y。


3.计算 min(x, y) * 2 + max(x, y) 的值,将其添加回数组中的任意位置。


重复执行上述步骤,直到数组中的所有元素都大于或等于 k。


请确保数组中至少有两个元素才能执行操作。


请根据上述要求重新设计一个算法,使得在最少的操作次数内,所有数组元素都大于或等于 k。


输入:nums = [2,11,10,1,3], k = 10。


输出:2。


解释:第一次操作中,我们删除元素 1 和 2 ,然后添加 1 * 2 + 2 到 nums 中,nums 变为 [4, 11, 10, 3] 。


第二次操作中,我们删除元素 3 和 4 ,然后添加 3 * 2 + 4 到 nums 中,nums 变为 [10, 11, 10] 。


此时,数组中的所有元素都大于等于 10 ,所以我们停止操作。


使数组中所有元素都大于等于 10 需要的最少操作次数为 2 。


答案 2024-08-21:


chatgpt


题目来自 leetcode3066。

大体步骤如下:

1.创建一个结构体 hp,包含一个 sort.IntSlice 数组,用于存储传入的整数数组 nums。


2.初始化 hp 结构体,将 nums 存入其中,并将其转换为最小堆结构。


3.进入循环,判断最小堆中的最小值是否小于等于 k,若是则执行以下步骤,否则结束循环:


3.a. 从最小堆中弹出最小值 x。


3.b. 将 x 值加倍,再放回最小堆对的顶部,并修正堆结构。


3.c. 计数器 ans 自增 1,表示执行了一次操作。


4.返回最少操作次数 ans。


总的时间复杂度:


  • 初始化堆结构时间复杂度为 O(n)。

  • 每次循环中从堆中弹出元素、修改堆结构的时间复杂度为 O(log(n)),最多执行 n 次。


因此,总的时间复杂度为 O(n log n)。


总的额外空间复杂度:


  • 除了存储输入数组外,额外使用了堆结构来维护最小值,因此额外空间复杂度为 O(n)。

Go 完整代码如下:

package main
import ( "fmt" "container/heap" "sort")
func minOperations(nums []int, k int) (ans int) { h := &hp{nums} heap.Init(h) for h.IntSlice[0] < k { x := heap.Pop(h).(int) h.IntSlice[0] += x * 2 heap.Fix(h, 0) ans++ } return}
type hp struct{ sort.IntSlice }
func (hp) Push(any) {}func (h *hp) Pop() any { a := h.IntSlice; v := a[len(a)-1]; h.IntSlice = a[:len(a)-1]; return v }
func main() { nums := []int{2, 11, 10, 1, 3} k := 10 fmt.Println(minOperations(nums, k))}
复制代码


Python 完整代码如下:

# -*-coding:utf-8-*-
import heapq
class Hp(list): def push(self, item): heapq.heappush(self, item)
def pop(self): return heapq.heappop(self)
def minOperations(nums, k): h = Hp(nums) heapq.heapify(h) ans = 0 while h[0] < k: x = h.pop() h[0] += x * 2 heapq.heappushpop(h, h[0]) ans += 1 return ans
nums = [2, 11, 10, 1, 3]k = 10print(minOperations(nums, k))
复制代码



发布于: 刚刚阅读数: 5
用户头像

公众号:福大大架构师每日一题 2021-02-15 加入

公众号:福大大架构师每日一题

评论

发布
暂无评论
2024-08-21:用go语言,给定一个从 0 开始索引的整数数组 nums 和一个整数 k,请设计一个算法来使得数组中的所有元素都大于或等于 k,返回所需的最少操作次数。 每次操作可以执行以下步骤_福大大架构师每日一题_福大大架构师每日一题_InfoQ写作社区