首页 > 其他分享 >2024-03-16:用go语言,给你一个正整数数组 nums, 每一次操作中,你可以从 nums 中选择 任意 一个数并将它减小到 恰好 一半。 (注意,在后续操作中你可以对减半过的数继续执行操作)

2024-03-16:用go语言,给你一个正整数数组 nums, 每一次操作中,你可以从 nums 中选择 任意 一个数并将它减小到 恰好 一半。 (注意,在后续操作中你可以对减半过的数继续执行操作)

时间:2024-03-16 15:23:53浏览次数:35  
标签:03 pq cur nums sum ans 操作 minus

2024-03-16:用go语言,给你一个正整数数组 nums,

每一次操作中,你可以从 nums 中选择 任意 一个数并将它减小到 恰好 一半。

(注意,在后续操作中你可以对减半过的数继续执行操作)

请你返回将 nums 数组和 至少 减少一半的 最少 操作数。

输入:nums = [5,19,8,1]。

输出:3。

答案2024-03-16:

来自左程云

灵捷3.5

大体步骤如下:

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) 

在这里插入图片描述

标签:03,pq,cur,nums,sum,ans,操作,minus
From: https://www.cnblogs.com/moonfdd/p/18077103

相关文章

  • es 聚合操作(一)
    前言Elasticsearch除搜索以外,提供了针对ES数据进行统计分析的功能。聚合(aggregations)可以让我们极其方便的实现对数据的统计、分析、运算。例如:衣服品牌的受欢迎程度这些衣服的平均价格、最高价格、最低价格这些衣服的每天、每月销量如何使用场景聚合查询可以用于各种场......
  • Vue3-03_组件基础_上
    单页面应用程序什么是单页面应用程序单页面应用程序(英文名:SinglePageApplication)简称SPA,顾名思义,指的是一个Web网站中只有唯一的一个HTML页面,所有的功能与交互都在这唯一的一个页面内完成。单页面应用程序的特点单页面应用程序将所有的功能局限于一个web页面中,仅在......
  • Git 操作——如何删除本地分支和远程分支
     Git操作——如何删除本地分支和远程分支 引言在大多数情况下,删除Git分支很简单。这篇文章会介绍如何删除Git本地分支和远程分支。用两行命令删除分支//删除本地分支gitbranch-dlocalBranchName//删除远程分支gitpushorigin--deleteremoteBranchName......
  • 20240315,逻辑类型,条件和逗号,函数,数组
    刚好看到逻辑类型,今天早上有个很好玩的事情,一早上醒来圆圆的小狗跑到了床下,然后她说“你是不是打我的小狗了”我;”我没有,我什么都不知道””他的屁股都扁了“我:“我怎么知道,他的屁股扁了关我什么事"“你怎么知道他的屁股扁了”我“不是你说的嘛”“我诈你的”,然后走了......
  • 【2024.03.12】定时执行专家 V7.2 发布 - TimingExecutor V7.2 Release
    目录▉软件介绍▉新版本V7.2 下载地址▉ V7.2新功能▼2024-03-12 V7.2 -更新日志▉ V7.x 新UI设计▉软件介绍《定时执行专家》是一款制作精良、功能强大、毫秒精度、专业级的定时任务执行软件。软件具有25种【任务类型】、12种【触发器】触发方式,并且......
  • module 'numpy' has no attribute 'bool'
    module'numpy'hasnoattribute'bool'问题:Traceback(mostrecentcalllast):File"/home/test.py",line138,in<module>inference(args,net,test_save_path)File"/home/test.py",line54,ininferenc......
  • 小米澎湃操作系统(Hyper OS)下,如何获取谷歌安全码(Google Security Code)
    打开任易一个谷歌的应用,比如Google搜索(一般就叫Google),或者Youtube,或者GoogleAuthenticator,点击右上角的头像,然后点击“管理您的Google账号”,再点页面中上部的横栏里的“安全性”选项卡,往下滑,就能看到“安全码”选项,点击进入即可。  ......
  • MongoTemplate的CRUD的操作示例:
    importorg.springframework.data.mongodb.core.MongoTemplate;importorg.springframework.data.mongodb.core.query.Criteria;importorg.springframework.data.mongodb.core.query.Query;importorg.springframework.data.mongodb.core.query.Update;importorg.spring......
  • L1-032 Left-pad 满分过
    L1-032Left-pad#include<bits/stdc++.h>usingnamespacestd;intmain(){intN;stringx;intt;stringy;cin>>N;scanf(""); cin>>x; scanf(""); getline(cin,y);t=y.length();......
  • 2024-03-15 leetcode写题记录
    目录2024-03-15leetcode写题记录32.最长有效括号题目链接题意解法42.接雨水题目链接题意解法动态规划双指针2024-03-15leetcode写题记录32.最长有效括号题目链接32.最长有效括号题意给你一个只包含$'\((\)'和'\()\)'的字符串,找出最长有效(格式正确且连续)括号子串的......