牛客NC79 丑数【中等 堆、优先级队列 Java,Go,PHP Go和PHP中我自己实现了优先级队列】

题目

在这里插入图片描述
题目链接:
https://www.nowcoder.com/practice/6aa9e04fc3794f68acf8778237ba065b

思路

注意: 数据范围:0≤n≤2000, 2000肯定到不了,最多到1690,相同题目链接:https://www.lintcode.com/problem/4。

思路,从小到大依次把丑数列出来,存入优先级队列

参考答案Java

import java.util.*;public class Solution {/*** 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可*** @param index int整型* @return int整型*/public int GetUglyNumber_Solution (int index) {//n最多到1690,题目给的到不了2000,if(index ==0) return 0;PriorityQueue<Long> pq = new PriorityQueue<>();for (long i = 1; i <= 0x7fffffff ; i *= 2) {for (long j = i; j <= 0x7fffffff ; j *= 3) {for (long k = j; k <= 0x7fffffff; k *= 5) {pq.add(k);}}}while (index > 1) {pq.poll();index--;}long s = pq.poll();return (int)s;}
}

参考答案Go

package main/*** 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可*** @param index int整型* @return int整型*/
func GetUglyNumber_Solution(index int) int {//Go的优先级队列,或者叫堆,需要自己实现if index ==0 {return  0}h := newHeap02(true)for i := 1; i <= 0x7fffffff; i *= 2 {for j := i; j <= 0x7fffffff; j *= 3 {for k := j; k <= 0x7fffffff; k *= 5 {h.add(k)}}}for index > 1 { //升序优先级队列中要保留一个h.remove()index--}return h.remove()
}type Heap02 struct { //heap的定义Array       []intSize        intDefaultSize intAsc         bool //true: 升序   false  降序
}func newHeap02(asc bool) Heap02 {return Heap02{Array: make([]int, 10), Size: 0, DefaultSize: 10, Asc: asc}
}func (h *Heap02) ensureSize(length int) { //扩容代码oldsize := len(h.Array)if oldsize >= length {return}//新增容量为旧容量的1.5倍newSize := oldsize + oldsize>>1newArr := make([]int, newSize)for i := 0; i < h.Size; i++ {newArr[i] = h.Array[i]}h.Array = newArr
}
func (h *Heap02) add(val int) { //新增oldSize := h.Sizeh.ensureSize(oldSize + 1)h.Array[oldSize] = valh.Size++//fmt.Println(h.Array, " is idx ")h.siftUp(oldSize)
}func (h *Heap02) siftUp(idx int) { //上滤,大顶堆cur := h.Array[idx]for idx > 0 {//fmt.Println(idx, " is idx ")pindex := (idx - 1) / 2parent := h.Array[pindex]if !h.Asc {if parent >= cur {break}} else {if parent <= cur {break}}h.Array[idx] = parentidx = pindex}h.Array[idx] = cur//fmt.Println(idx, " is idx ")
}// 删除:二叉堆的删除是删除堆顶元素
// 思路:最后一个元素代替堆顶元素,删除最后一个元素,然后下窜
func (h *Heap02) remove() int {last := h.Size - 1root := h.Array[0]h.Array[0] = h.Array[last]//arr[last] 不用管了,因为长度要减1,减1后,最后一个元素也不存在了h.siftDown(0)h.Size--return root
}func (h Heap02) siftDown(idx int) {half := h.Size >> 1root := h.Array[0]for idx < half {// idx:只有左节点,或者左右子节点都有pos := (idx << 1) + 1child := h.Array[pos]right := pos + 1if !h.Asc {if right < h.Size && h.Array[right] > h.Array[pos] {pos = rightchild = h.Array[right]}if root > child {break}} else {if right < h.Size && h.Array[right] < h.Array[pos] {pos = rightchild = h.Array[right]}if root < child {break}}h.Array[idx] = childidx = pos}h.Array[idx] = root
}func (h Heap02) get() int { //获取堆顶元素if h.Size == 0 {const INT_MAX = int(^uint(0) >> 1)return ^INT_MAX}return h.Array[0]
}// 删除堆顶的元素的同时,插入一个新元素
func (h Heap02) replace(ele int) int { //替换堆顶元素const INT_MAX = int(^uint(0) >> 1)root := ^INT_MAXif h.Size == 0 {h.Array[0] = eleh.Size++} else {root = h.Array[0]h.Array[0] = eleh.siftDown(0)}return root
}

参考答案PHP

<?php/*** 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可** * @param index int整型 * @return int整型*/
function GetUglyNumber_Solution( $index )
{if($index ==0) return 0;//PHP中的优先级队列,或者叫堆,需要自己实现$h = new Heap();for($i=1;$i<=0x7fffffff;$i*=2){for($j=$i;$j<=0x7fffffff;$j*=3){for($k=$j;$k<0x7fffffff;$k*=5){$h->add($k);}}}while ($index>1) { //保留一个$h->remove();$index--;}return $h->remove();
}class Heap   //堆
{public $arr = array();public $size = 0;public $defaultSize = 10;public $asc = true;  //true: 小顶堆  false:大顶堆public function __construct(){for ($i = 0; $i < $this->defaultSize; $i++) {$this->arr[$i] = 0;}}public function ensureSize($len) //扩容代码{$oldSize = count($this->arr);if ($oldSize >= $len) return;$newSize = $oldSize + $oldSize >> 1;$arr1 = array();for ($i = 0; $i < $newSize; $i++) {$arr1[$i] = 0;if ($i < $oldSize) {$arr1[$i] = $this->arr[$i];}}$this->arr = $arr1;}public function add($val){$oldSize = $this->size;$this->ensureSize($oldSize + 1);$this->arr[$oldSize] = $val;$this->size++;$this->siftUp($oldSize);}public function siftUp($idx){ //上滤$root = $this->arr[$idx];while ($idx > 0) {$pindex = ($idx - 1) / 2;$parent = $this->arr[$pindex];if (!$this->asc) {if ($parent >= $root) break;} else {if ($parent <= $root) break;}$this->arr[$idx] = $parent;$idx = $pindex;}$this->arr[$idx] = $root;}//删除:二叉堆的删除是删除堆顶元素//思路:最后一个元素代替堆顶元素,删除最后一个元素,然后下窜public function remove(){$root = $this->arr[0];$this->arr[0] = $this->arr[$this->size - 1];//arr[last] 不用管了,因为长度要减1,减1后,最后一个元素也不存在了$this->siftDown(0);$this->size--;return $root;}public function siftDown($idx){$half = $this->size >> 1;$root = $this->arr[0];while ($idx < $half) {//index:只有左子节点,或者左右子节点都有$childIndex = ($idx << 1) + 1;$right = $childIndex + 1;$child = $this->arr[$childIndex];if (!$this->asc) {if ($right < $this->size && $this->arr[$right] > $this->arr[$childIndex]) {$childIndex = $right;$child = $this->arr[$right];}if ($child < $root) break;} else {if ($right < $this->size && $this->arr[$right] < $this->arr[$childIndex]) {$childIndex = $right;$child = $this->arr[$right];}if ($child > $root) break;}$this->arr[$idx] = $child;$idx = $childIndex;}$this->arr[$idx] = $root;}//获取堆顶元素public function get(){if ($this->size == 0) return 2147483647;return $this->arr[0];}//替换堆顶元素//删除堆顶的元素的同时,插入一个新元素public function replace($ele){$root = 2147483647;if ($this->size == 0) {$this->arr[0] = $ele;$this->size++;} else {$root = $this->arr[0];$this->arr[0] = $ele;$this->siftDown(0);}return $root;}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/775186.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Dockerfile:自定义镜像

Dockerfile 是一个文本文件&#xff0c;其中包含了一系列用于自动化构建Docker镜像的指令。通过编写Dockerfile&#xff0c;开发者能够明确地定义一个软件应用及其运行环境应该如何被封装进一个可移植、可重复构建的Docker镜像中。 第一步&#xff1a;在/tmp文件下新建docker…

HTTPS握手解析

TLS握手过程 HTTP 由于是明文传输&#xff0c;所谓的明文&#xff0c;就是说客户端与服务端通信的信息都是肉眼可见的&#xff0c;随意使用一个抓包工具都可以截获通信的内容。 存在的风险 窃听风险&#xff0c;比如通信链路上可以获取通信内容&#xff0c;用户号容易没。 篡…

hadoop 查询hdfs资源信息的方式

hdfs dfsadmin -report &#xff3b;-live&#xff3d;&#xff3b;-dead&#xff3d;&#xff3b;-decommissioning&#xff3d;

二分练习题——晾衣服

晾衣服 题目分析 这里出现了“最小化干燥的总时间”&#xff0c;那么可以考虑用二分去做。 第一阶段二段性分析 假设当前需要耗费的时间为mid分钟&#xff0c;如果mid分钟内可以烘干这些衣服&#xff0c;那么我们可以确定右边界大于mid的区间一定也可以。但是此时我需要找的…

前缀和算法(1)

目录 一维前缀和[模板] 一、题目描述 二、思路解析 三、代码 二维前缀和[模板] 一、题目描述 二、思路解析 三、代码 724.寻找数组的中心下标 一、题目描述 二、思路解析 三、代码 238.除自身以外数组的乘积 一、题目描述 二、思路解析 三、代码 一维前缀和[模…

SQLynx发布3.0.0版本:带来更流畅便捷的SQL开发体验

作为新一代的一站式数据库管理开发工具&#xff0c; SQLynx自发布上线以来&#xff0c;一直受到广大用户的好评与鼓励。 为了给用户提供更高效、更便捷、更可靠的数据库管理开发体验&#xff0c;SQLynx今日正式发布3.0.0版本&#xff0c;同步在麦聪软件官网上线&#xff0c;全…

centos 安装 netstat

要在CentOS系统上安装netstat命令&#xff0c;您需要安装名为net-tools的软件包&#xff0c;因为netstat是该包中包含的一个工具。以下是使用系统自带的软件包管理器进行安装的步骤&#xff1a; 对于使用yum的CentOS&#xff08;如CentOS 6或7&#xff09;&#xff1a; # 更新…

【AIGC】阿里云ecs部署stable diffusion

文章目录 安装anaconda安装cudagit 加速配置虚拟环境挂载oss端口开放启动服务其他controlnet显卡使用监控 参考资料 安装anaconda 安装Python、wget、git sudo apt install python3 python3-pip python3-virtualenv wget git 安装前置依赖 sudo apt-get install libgl1-mesa-…

0DAY漏洞是什么,如何进行有效的防护

零日漏洞&#xff0c;指的是软件或系统中未被公开的、未被厂商知晓的安全漏洞。这些漏洞未被修复&#xff0c;因此黑客可以利用它们进行攻击&#xff0c;而受害者往往无法防范。由于这些漏洞的存在时间很短&#xff0c;因此称之为“零日漏洞”&#xff0c;也称为“0day漏洞”。…

VMware ESXi部署macOS Monterey

正文共&#xff1a;1024 字 30 图&#xff0c;预估阅读时间&#xff1a;2 分钟 最早使用黑苹果是在2015年&#xff0c;装在了古老的Acer商务本上&#xff08;老樹發新芽&#xff0c;acer tm 4750g裝黑蘋果&#xff09;&#xff1b;上次安装黑苹果是在两年前&#xff08;VMware…

【爬虫基础】第3讲 常见浏览器User-Agent大全

User-Agent是浏览器或其他网络客户端发送给服务器的HTTP请求头字段&#xff0c;用于告诉服务器客户端的信息&#xff0c;包括操作系统、浏览器等。 以下是一些常见的浏览器User-Agent字符串&#xff1a; Chrome浏览器&#xff1a; Windows&#xff1a;Mozilla/5.0 (Windows NT…

淘宝详情数据采集(商品上货,数据分析,属性详情,价格监控),海量数据值得get

淘宝详情数据采集涉及多个环节&#xff0c;包括商品上货、数据分析、属性详情以及价格监控等。在采集这些数据时&#xff0c;尤其是面对海量数据时&#xff0c;需要采取有效的方法和技术来确保数据的准确性和完整性。以下是一些关于淘宝详情数据采集的建议&#xff1a; 请求示…

显示器刷新率

什么是刷新率以及为什么它很重要&#xff1f;- 英特尔 (intel.cn) 刷新率&#xff1a;显示器更新屏显图片的频率。 显示器每秒绘制新图像的次数。单位&#xff1a;Hz 刷新率为144Hz&#xff0c;指每秒钟刷新图像144次。 需要CPU和GPU能够迅速生成图像。 例如&#xff0c;显…

学习可视化比较好用的网站Apache ECharts

Apache ECharts 是一个基于 JavaScript 的开源可视化图表库&#xff0c;它提供了直观、交互丰富且可高度个性化定制的数据可视化图表。这个库最初由百度团队开源&#xff0c;并在 2018 年初捐赠给了 Apache 基金会&#xff0c;成为 ASF 的孵化级项目。在 2021 年 1 月 26 日&am…

四、在数据库里建库

一、查库 ##1&#xff09;库:一个库就是一个excell文档&#xff0c;库里含有表,一个表就是一个excell的sheet. ##2&#xff09;查看数据库实例中有哪些库 MariaDB [(none)]> show databases; -------------------- | Database | -------------------- | informat…

LabVIEW2024中文版软件安装包、工具包、安装教程下载

下载链接&#xff1a;LabVIEW及工具包大全-三易电子工作室http://blog.eeecontrol.com/labview6666 《LabVIEW2024安装图文教程》 1、解压后&#xff0c;双击install.exe安装 2、选中“我接受上述许可协议”&#xff0c;点击下一步 3、点击下一步&#xff0c;安装NI Package …

ChatGPT赋能大气科学:GPT与Python结合应用遥感降水数据处理、ERA5大气再分析数据的统计分析、干旱监测及风能和太阳能资源评估等

目录 专题一 AI领域常见工具讲解 专题二 POE平台及ChatGPT使用方法 专题三 提示词工程 专题四 科研常见应用场景 专题五 Python简明教程 专题六 GPT科研绘图 专题七 GPT辅助下载数据 专题八 遥感降水数据 专题九 数据产品评估 专题十 ERA5全球大气再分析数据 专题十…

Xilinx IDDR及ODDR使用和仿真

平台&#xff1a;Vivado2018 官方相关文档&#xff0c;ug471_7Series_SelectIO.pdf 关于IDDR与ODDR Input DDR Resource(IDDR) 外部的数据在时钟的上下沿同时传输数据&#xff0c;我们可以使用IDDR原语将输入的单bit数据转化为2bit的数据输出。同时数据速率变为原来的二分之一…

RabbitMQ简单介绍

什么是消息队列 消息队列是一种在应用程序之间传递消息的通信模式。它提供了一种异步的、可靠的方式来处理分布式系统中的消息传递。在消息队列中&#xff0c;消息发送者&#xff08;Producer&#xff09;将消息发送到队列&#xff08;Queue&#xff09;中&#xff0c;而消息接…

网络链路层之(1)基础概念

网络链路层之(1)基础概念 Author: Once Day Date: 2024年3月27日 一位热衷于Linux学习和开发的菜鸟&#xff0c;试图谱写一场冒险之旅&#xff0c;也许终点只是一场白日梦… 漫漫长路&#xff0c;有人对你微笑过嘛… 全系列文章可参考专栏: 通信网络技术_Once-Day的博客-CSD…