2024-03-16:用go语言,给你一个正整数数组 nums, 每一次操作中,你可以从 nums 中选择 任意 一个数并将它减小到 恰好 一半。 (注意,在后续操作中你可以对减半过的数继续执行操作)
2024-03-16:用go语言,给你一个正整数数组 nums,
每一次操作中,你可以从 nums 中选择 任意 一个数并将它减小到 恰好 一半。
(注意,在后续操作中你可以对减半过的数继续执行操作)
请你返回将 nums 数组和 至少 减少一半的 最少 操作数。
输入:nums = [5,19,8,1]。
输出:3。
答案2024-03-16:
来自左程云。
大体步骤如下:
1.定义一个优先队列(PriorityQueue)来存储数组中的数字,优先级为数字的倒数。
2.计算数组中所有数字的和,并将和除以2得到目标值(sum)。
3.初始化操作次数(ans)为0,初始化当前减半的数值之和(minus)为0。
4.循环直到当前减半的数值之和(minus)大于等于目标值(sum):
弹出优先队列中最大的数值(cur)。
将弹出的数值除以2得到新的数值(cur/2)。
将新的数值添加回优先队列中。
更新操作次数(ans)加1。
更新当前减半的数值之和(minus)加上新的数值(cur/2)。
5.返回操作次数(ans)作为结果。
总的时间复杂度为O(nlogn),其中n为数组的长度。堆操作的时间复杂度为O(logn)。
总的额外空间复杂度为O(n),需要额外的优先队列来存储数组中的数字。
Go完整代码如下:
package main
import (
"container/heap"
"fmt"
)
type PriorityQueue []float64
func (pq PriorityQueue) Len() int {
return len(pq)
}
func (pq PriorityQueue) Less(i, j int) bool {
return pq[i] > pq[j]
}
func (pq PriorityQueue) Swap(i, j int) {
pq[i], pq[j] = pq[j], pq[i]
}
func (pq *PriorityQueue) Push(x interface{}) {
item := x.(float64)
*pq = append(*pq, item)
}
func (pq *PriorityQueue) Pop() interface{} {
old := *pq
n := len(old)
item := old[n-1]
*pq = old[0 : n-1]
return item
}
func halveArray(nums []int) int {
pq := make(PriorityQueue, 0)
sum := 0.0
for _, num := range nums {
heap.Push(&pq, float64(num))
sum += float64(num)
}
sum /= 2
ans := 0
for minus := 0.0; minus < sum; ans++ {
cur := heap.Pop(&pq).(float64) / 2
minus += cur
heap.Push(&pq, cur)
}
return ans
}
func main() {
nums := []int{5, 19, 8, 1}
result := halveArray(nums)
fmt.Println(result)
}

Python完整代码如下:
# -*-coding:utf-8-*-
import heapq
def halveArray(nums):
pq = []
sum = 0.0
for num in nums:
heapq.heappush(pq, -float(num))
sum += float(num)
sum /= 2
ans = 0
minus = 0.0
while minus < sum:
cur = -heapq.heappop(pq) / 2
minus += cur
heapq.heappush(pq, -cur)
ans += 1
return ans
nums = [5, 19, 8, 1]
result = halveArray(nums)
print(result)

2024-03-16:用go语言,给你一个正整数数组 nums, 每一次操作中,你可以从 nums 中选择 任意 一个数并将它减小到 恰好 一半。 (注意,在后续操作中你可以对减半过的数继续执行操作)的更多相关文章
- C语言,输入一个正整数,按由大到小的顺序输出它的所有质数的因子(如180=5*3*3*2*2)
#include <iostream> using namespace std; int main() { long num; while(cin >> num){ ){ co ...
- 【C语言】输入一个正整数,判断其是否为素数
素数的定义: 素数(prime number)又称质数,有无限个. 素数定义为在大于1的自然数中,除了1和它本身以外不再有其他因数,这样的数称为素数.代码1: #include<stdio.h& ...
- Wed Nov 01 13:03:16 CST 2017 WARN: Establishing SSL connection without server's identity verification is not recommended.
报错:Wed Nov 01 13:03:16 CST 2017 WARN: Establishing SSL connection without server's identity verifica ...
- C语言入门(16)——C语言的数组
和结构体类似,数组也是一种复合数据类型,它由一系列相同类型的元素组成.C语言支持一维数组和多维数组.如果一个数组的所有元素都不是数组,那么该数组称为一维数组. 一维数组的定义方式 在C语言中使用数组必 ...
- Go语言笔记[实现一个Web框架实战]——EzWeb框架(一)
Go语言笔记[实现一个Web框架实战]--EzWeb框架(一) 一.Golang中的net/http标准库如何处理一个请求 func main() { http.HandleFunc("/& ...
- C语言学习笔记之成员数组和指针
成员数组和指针是我们c语言中一个非常重要的知识点,记得以前在大学时老师一直要我们做这类的练习了,但是最的还是忘记了,今天来恶补一下. 单看这文章的标题,你可能会觉得好像没什么意思.你先别下这个 ...
- 智能合约语言 Solidity 教程系列5 - 数组介绍
写在前面 Solidity 是以太坊智能合约编程语言,阅读本文前,你应该对以太坊.智能合约有所了解, 如果你还不了解,建议你先看以太坊是什么 本文前半部分是参考Solidity官方文档(当前最新版本: ...
- C语言博客作业—字符数组
一.PTA实验作业 题目1:字符串转换成十进制整数 1. 本题PTA提交列表 2. 设计思路 (1)定义i为循环变量,number用于存放每一次转化的结果,flag用于判断是否为负数,p用于修改结果的 ...
- Go 语言的下一个大版本:Go 2.0 被安排上了(全面兼容1.X,改进错误处理和泛型这两大主题)
今年 8 月 Go 开发团队公布了 Go 2.0 的设计草案,包括错误处理和泛型这两大主题.现在备受瞩目的 Go 2.0 又有了新动向 —— 昨日 Go 开发团队在其官方博客表示,Go 2 已经被安排 ...
- C语言基础 (6) 类型转换,数组与随机数
复习 1.隐式转换 Double a Int b = 1 A = b //编译器自动转换把b转换为double类型后 再给a赋值(隐式转换) 2.强制类型转换 (变量)类型名 Int a = 1 // ...
随机推荐
- Python 潮流周刊第 38 期(摘要)+赠书5本
本周刊由 Python猫 出品,精心筛选国内外的 250+ 信息源,为你挑选最值得分享的文章.教程.开源项目.软件工具.播客和视频.热门话题等内容.愿景:帮助所有读者精进 Python 技术,并增长职 ...
- .NET 云原生架构师训练营(RGCA 四步架构法)--学习笔记
RGCA Requirement:从利益相关者获取需求 Goal:将需求转化为目标(功能意图) Concept:将目标扩展为完整概念 Architecture:将概念扩展为架构 目录 从利益相关者获取 ...
- 《ASP.ENT Core 与 RESTful API 开发实战》-- (第4章)-- 读书笔记(下)
第 4 章 资源操作 4.5 创建资源 由于创建资源的 Id 会在服务端生成,因此在创建资源时,不建议使用与获取数据时相同的 DTO,而要单独创建一个新的 DTO 类,并通过数据注解特性对相应 的属性 ...
- 《ASP.ENT Core 与 RESTful API 开发实战》-- 读书笔记(第1章)
第 1 章 REST 简介 1.1 API 与 REST API 是一个系统向外暴露或公开的一套接口,通过这些接口,外部应用程序能够访问该系统 REST 是一种基于资源的架构风格,任何能够命名的对象都 ...
- 在Windows上使用.NET部署到Docker 《让孩子们走出大坑》
折腾Docker 有几天了,整别的都没这个糟心.目前已经顺利部署运行起来了.顺便给大家分享下处理在Windows上使用.NET部署到Docker的相关问题解决方法. 1. Docker无法安装问题 ...
- JS Leetcode 155. 最小栈 题解分析
壹 ❀ 引 本题来自LeetCode155. 最小栈,难度简单,题目描述如下: 设计一个支持 push ,pop ,top 操作,并能在常数时间内检索到最小元素的栈. push(x) -- 将元素 x ...
- oracle中使用自定义函数解析指定分隔符的字符串
1.创建字符串表类型 create type tab_varchar is table of varchar2(2000); 2.创建管道函数 create or replace function g ...
- std::shared_ptr 线程安全方面的思考
一直惦记着 std::shared_ptr 线程安全的问题,看了些文章后,又怕过段时间忘记了,遂记录下来 std::shared_ptr 的线程安全问题主要有以下两种: 引用计数的加减操作是否线程安全 ...
- 学习go语言编程之面向对象
类型系统 类型系统是指一个语言的类型体系结构,一个典型的类型系统通常包含如下基本内容: 基础类型,如:byte.int.bool.float等 复合类型,如:数组.结构体.指针等 可以指向任意对象的类 ...
- Flutter学习(一)——创建一个项目
本文基于 flutter 2.5.1,开发工具 Visual Studio Code. 一.创建 打开 VS Code 点击 View > Command Palette-(快捷键command ...