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

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

时间:2024-08-21 17:04:02浏览次数:14  
标签:10 nums 元素 整数 数组 ans go 操作

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 = 10
print(minOperations(nums, k))

在这里插入图片描述

标签:10,nums,元素,整数,数组,ans,go,操作
From: https://www.cnblogs.com/moonfdd/p/18372056

相关文章

  • 【C语言入门】如何使用动态内存分配来模拟“大小未知”的数组
    如何使用动态内存分配来模拟“大小未知”的数组引子举例应用结语引子在C语言中,定义一个“大小未知”的数组直接是不可行的,因为数组在声明时必须有确定的大小,要么是在编译时确定的常量表达式,要么是在C99或更高标准下,允许运行时确定大小的变长数组(VLA)。变长数组(Varia......
  • 整数排序(排序-基本题)【希冀】
    【问题描述】从标准输入中输入一组互不相同的整数(个数不超过100)及排序方式,按照从小到大排序,输出按某种算法排序的结果及元素的比较次数。说明:排序方式为一个1~5的整数,分别表示:1:选择排序,比较次数是指选择未排序部分的最小元素时的比较次数。2:冒泡排序,比较次数是指相邻元素的......
  • 「漏洞复现」微商城系统 goods.php SQL注入漏洞
    0x01 免责声明请勿利用文章内的相关技术从事非法测试,由于传播、利用此文所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,作者不为此承担任何责任。工具来自网络,安全性自测,如有侵权请联系删除。本次测试仅供学习使用,如若非法他用,与平台和本文作者无关,需......
  • Django 后端架构开发:文件云存储,从本地存储到腾讯COS桶集成
    ⭐Django后端架构开发:文件云存储,从本地存储到腾讯COS桶集成目录☁️文件云存储-项目使用云存储......
  • Django 后端架构开发:JWT 项目实践与Drf版本控制
    ......
  • 如何去除有序数组中的重复元素
    题目要求:输入一个有序的数组,你需要原地删除重复的元素,使得每个元素只能出现一次,返回去重后新数组的长度题目分析:原地删除,即不可以创建新的辅助数组,那么需要在原数组上修改解决。这种一般采用双指针技巧即:如果是普通数组,使用两个指针slow和fast,fast负责网后遍历,如果发现数组元素......
  • Go Lang语言实现文件的写入、追加、读取、复制等操作
    /*Go语言的os包下有一个OpenFile函数,其原型如下所示:funcOpenFile(namestring,flagint,permFileMode)(file*File,errerror)其中name是文件的文件名,如果不是在当前路径下运行需要加上具体路径;flag是文件的处理参数,为int类型,根据系统的不同具体值可能有所不同......
  • go的链式方法
    func(r*Request)Name(resourceNamestring)*Request{ifr.err!=nil{returnr}iflen(resourceName)==0{r.err=fmt.Errorf("resourcenamemaynotbeempty")returnr}iflen(r.resourceName)!=0{......
  • go 面试资料整理
    go语言基础熟悉语法,撸个百十道基础面试题就差不多了。go语言进阶go中有哪些锁?sync.Mutex互斥锁sync.RWMutex读写锁CSP并发模型?CSP并发模型它并不关注发送消息的实体,而关注的是发送消息时使用的channel,go语言借用了proce......
  • C++类模板案例-数组类封装
    #include<iostream>usingnamespacestd;template<classT>classMyArray{public: MyArray(intcapacity) { this->m_Capacity=capacity; this->m_Size=0; this->pAddress=newT[this->m_Capacity]; } ~MyArray() { if(th......