牛客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.hqwc.cn/news/572771.html

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

相关文章

计算机网络——28自治系统内部的路由选择

自治系统内部的路由选择 RIP 在1982年发布的BSD-UNIX中实现Distance vector算法 距离矢量&#xff1a;每条链路cost 1&#xff0c;# of hops(max 15 hops)跳数DV每隔30秒和邻居交换DV&#xff0c;通告每个通告包括&#xff1a;最多25个目标子网 RIP通告 DV&#xff1a;在…

sqlite跨数据库复制表

1.方法1 要将 SQLite 数据库中的一个表复制到另一个数据库&#xff0c;您可以按照以下步骤操作&#xff1a; 备份原始表的SQL定义和数据&#xff1a; 使用 sqlite3 命令行工具或任何SQLite图形界面工具&#xff0c;您可以执行以下SQL命令来导出表的SQL定义和数据&#xff1a…

关于v114之后的chromedriver及存放路径

使用selenium调用浏览器时&#xff0c;我一直调用谷歌浏览器&#xff0c;可浏览器升级后&#xff0c;就会再次遇到以前遇到过的各种问题&#xff0c;诸如&#xff1a;1、怎么关闭浏览器更新&#xff1b;2、去哪儿下载chromedriver&#xff1b;3、114版本之后的驱动去哪儿下载&a…

AJAX(二):axios 和 fetch函数发送AJAX请求、同源策略、 jsonp、CORS

一、各种发送AJAX请求 jquery基于回调函数&#xff0c;axios基于promise 1.axios发送AJAX请求!!! axios (v1.5.0) - Axios 是一个基于 promise 的 HTTP 库,可以用在浏览器和 Node.js 中。 | BootCDN - Bootstrap 中文网开源项目免费 CDN 加速服务 服务器&#xff1a; app.…

【tingsboard开源平台】下载数据库,IDEA编译,项目登录

一&#xff0c; PostgreSQL 下载 需要看官网的&#xff1a;点此下载直达地址&#xff1a;点此进行相关学习&#xff1a;PostgreSQL 菜鸟教程 二&#xff0c;PostgreSQL 安装 点击安装包进行安装 出现乱码错误&#xff1a; There has been an error. Error running C:\Wind…

Lua热更新(xlua)

发现错误时检查是否:冒号调用 只需要导入asset文件夹下的Plugins和Xlua这两个文件即可,别的不用导入 生成代码 和清空代码 C#调用lua using Xlua; 需要引入命名空间 解析器里面执行lua语法 lua解析器 LuaEnv 单引号是为了避免引号冲突 第二个参数是报错时显示什么提示…

Llama模型下载

最近llama模型下载的方式又又变了&#xff0c;所以今天简单更新一篇文章&#xff0c;关于下载的&#xff0c;首先上官网&#xff0c;不管在哪里下载你都要去官网登记一下信息&#xff1a;https://llama.meta.com/llama2 然后会出现下面的信息登记网页&#xff1a; 我这里因为待…

Python接口自动化pytest框架安装

1、创建一个requirements.txt文件夹 2、输入内容&#xff1a;如下图 pytest pytest-html pytest-xdist pytest-ordering pytest-rerunfailures pytest-base-url allure-pytest3、在terminal中输入安装命令&#xff1a;pip install -r requirements.txt 安装成功 4、在termina…

【研发日记】Matlab/Simulink开箱报告(十)——Signal Routing模块模块

文章目录 前言 Signal Routing模块 虚拟模块和虚拟信号 Mux和Demux Vector Concatenate和Selector Bus Creator和Bus Selector 分析和应用 总结 前言 见《开箱报告&#xff0c;Simulink Toolbox库模块使用指南&#xff08;五&#xff09;——S-Fuction模块(C MEX S-Fun…

ClickHouse10-ClickHouse中Kafka表引擎

Kafka表引擎也是一种常见的表引擎&#xff0c;在很多大数据量的场景下&#xff0c;会从源通过Kafka将数据输送到ClickHouse&#xff0c;Kafka作为输送的方式&#xff0c;ClickHouse作为存储引擎与查询引擎&#xff0c;大数据量的数据可以得到快速的、高压缩的存储。 Kafka大家…

YOLOv5实战记录02 模型检测

本人记录打卡&#xff0c;不够自习&#xff0c;慎看。 今天主要学了计组和计网&#xff0c;YOLO简单打个卡。 指路大佬&#xff1a;【手把手带你实战YOLOv5-入门篇】YOLOv5 模型检测_哔哩哔哩_bilibili 1. 主要讲了几个关键参数&#xff1a; 图源你可是处女座 运行示例&#…

在企业微信里面添加h5页面 进行登录授权

1.需求&#xff1a;在企业微信里面添加h5页面 进行登录授权&#xff0c;获取到用户的code&#xff0c;进行登入id的验证 2.步骤&#xff1a; 根据企业微信开发者中心中构造网页授权链接进行授权 在企业微信内部进行配置&#xff0c;拿到appid&#xff0c;redirect_uri&#x…