牛客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…

hadoop 查询hdfs资源信息的方式

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

前缀和算法(1)

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

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

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

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…

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

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

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

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

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…

HarmonyOS应用/元服务发布流程

在发布HarmonyOS应用/元服务前&#xff0c;建议您在本地进行调试&#xff0c;以查看和验证应用/元服务运行效果&#xff0c;减少发布过程中可能遇到的问题。 华为支持您使用HUAWEI DevEco Studio自动化签名的方式对应用/元服务进行调试&#xff0c;总体流程如下。 配置签名信息…

H12-831_338

多选题338、某园区部署OSPF实现网络互通&#xff0c;其中R2的LSDB如图所示。以下关于该LSDB信息的描述&#xff0c;错误的有哪些项? A.此时R4不能访间地址10.1.35.5/24&#xff0c;因为R4所在的Area l内没有泛洪R3-R5互联网段路由信息 B.Area l内无3类LSA&#xff0c;有7类1SA…

【LVGL-键盘部件,实体按键控制】

LVGL-二维码库 ■ LVGL-键盘部件■ 示例一&#xff1a;键盘弹窗提示■ 示例二&#xff1a;设置键盘模式■ 综合示例&#xff1a; ■ LVGL-实体按键控制■ 简介 ■ LVGL-键盘部件 ■ 示例一&#xff1a;键盘弹窗提示 lv_keyboard_set_popovers(kb,true);■ 示例二&#xff1a;设…

前端 CSS 经典:grid 栅格布局

前言&#xff1a;Grid 布局是将容器划分成"行"和"列"&#xff0c;产生单元格&#xff0c;然后将"项目"分配给划分好的单元格&#xff0c;因为有行和列&#xff0c;可以看作是二维布局。 一 术语 1. 容器 采用网格布局的区域&#xff0c;也就是…

Chakra UI:重塑React组件开发的未来

随着前端开发技术的不断演进&#xff0c;React已经成为了一个不可或缺的开源JavaScript库&#xff0c;用于构建用户界面。然而&#xff0c;虽然React提供了构建用户界面的强大工具&#xff0c;但在组件的可访问性、可重复使用性和可组合性方面仍存在挑战。Chakra UI正是一个为解…

上位机图像处理和嵌入式模块部署(qmacvisual区域提取)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 在图像处理中&#xff0c;有两部分比较重要&#xff0c;一个是区域分割&#xff0c;一个是区域提取。区域分割&#xff0c;比较好理解&#xff0c;…

MFC标签设计工具 图片控件上,移动鼠标显示图片控件内的鼠标xy的水平和垂直辅助线要在标签模板上加上文字、条型码、二维码 找准坐标和字体大小 源码

需求&#xff1a;要在标签模板上加上文字、条型码、二维码 找准坐标和字体大小 我生成标签时&#xff0c;需要对齐和 调文字字体大小。这工具微调 能快速知道位置 和字体大小。 标签设计(点击图片&#xff0c;上下左右箭头移动 或-调字体) 已经够用了&#xff0c;滚动条还没完…