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

news2024/12/26 23:38:17

题目

在这里插入图片描述
题目链接:
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       []int
	Size        int
	DefaultSize int
	Asc         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>>1
	newArr := 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.Size
	h.ensureSize(oldSize + 1)
	h.Array[oldSize] = val
	h.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) / 2
		parent := h.Array[pindex]

		if !h.Asc {
			if parent >= cur {
				break
			}
		} else {
			if parent <= cur {
				break
			}
		}

		h.Array[idx] = parent
		idx = pindex
	}
	h.Array[idx] = cur
	//fmt.Println(idx, " is idx ")
}

// 删除:二叉堆的删除是删除堆顶元素
// 思路:最后一个元素代替堆顶元素,删除最后一个元素,然后下窜
func (h *Heap02) remove() int {
	last := h.Size - 1
	root := 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 >> 1
	root := h.Array[0]

	for idx < half {
		// idx:只有左节点,或者左右子节点都有
		pos := (idx << 1) + 1
		child := h.Array[pos]
		right := pos + 1
		if !h.Asc {
			if right < h.Size && h.Array[right] > h.Array[pos] {
				pos = right
				child = h.Array[right]
			}

			if root > child {
				break
			}
		} else {
			if right < h.Size && h.Array[right] < h.Array[pos] {
				pos = right
				child = h.Array[right]
			}

			if root < child {
				break
			}
		}

		h.Array[idx] = child
		idx = 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_MAX
	if h.Size == 0 {
		h.Array[0] = ele
		h.Size++
	} else {

		root = h.Array[0]
		h.Array[0] = ele
		h.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.coloradmin.cn/o/1549655.html

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

相关文章

netty构建udp服务器以及发送报文到客户端客户端详细案例

目录 一、基于netty创建udp服务端以及对应通道设置关键 二、发送数据 三、netty中的ChannelOption常用参数说明 1、ChannelOption.SO_BACKLOG 2、ChannelOption.SO_REUSEADDR 3、ChannelOption.SO_KEEPALIVE 4、ChannelOption.SO_SNDBUF和ChannelOption.SO_RCVBUF 5、Ch…

CUDA安装 Windows版

目录 一、说明 二、安装工具下载 三、CUDA安装 四、cuDNN配置 五、验证安装是否成功 一、说明 windows10 版本安装 CUDA &#xff0c;首先需要下载两个安装包 CUDA toolkitcuDNN 官方教程 CUDA&#xff1a;https://docs.nvidia.com/cuda/cuda-installation-guide-micro…

2.2 添加商户缓存

实战篇Redis 2.2 添加商户缓存 在我们查询商户信息时&#xff0c;我们是直接操作从数据库中去进行查询的&#xff0c;大致逻辑是这样&#xff0c;直接查询数据库那肯定慢咯&#xff0c;所以我们需要增加缓存 GetMapping("/{id}") public Result queryShopById(Pat…

政安晨:【深度学习神经网络基础】(一)—— 逐本溯源

政安晨的个人主页&#xff1a;政安晨 欢迎 &#x1f44d;点赞✍评论⭐收藏 收录专栏: 政安晨的机器学习笔记 希望政安晨的博客能够对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff01; 与计算机一样的古老历史 神经网络的出现可追溯到20世纪40年…

Android源码阅读WorkMangaer - 6

前言 由于笔者目前水平限制&#xff0c;表达能力有限&#xff0c;尽请见谅。 WorkManager 是 Android Jetpack 库的一部分&#xff0c;提供了一种向后兼容的方式来安排可延迟的异步任务&#xff0c;这些任务即使在应用退出或设备重启后也应该继续执行&#xff0c;它是 Androi…

记录 AI绘图 Stable Diffusion的本地安装使用,可搭建画图服务端

开头 最近刷短视频看到了很多关于AI绘图&#xff0c;Midjourney&#xff0c;gittimg.ai&#xff0c;Stable Diffusion等一些绘图AI工具&#xff0c;感受到了AI绘画的魅力。通过chatGPT生成关键词再加上绘图工具&#xff0c;真是完美&#xff0c;文末教大家如何用gpt提词 Midj…

Anaconda的GEE环境中安装torch库

打开Anaconda&#xff0c;点击运行&#xff0c;打开terminal 输入pip install torch 而且由于anaconda中自己配置好了镜像源&#xff0c;在pip时自动使用清华镜像源

2024年4月份 风车IM即时通讯系统APP源码 版完整苹果安卓教程

关于风车IM&#xff0c;你在互联网上能随便下载到了基本都是残缺品&#xff0c; 经过我们不懈努力最终提供性价比最高&#xff0c;最完美的版本&#xff0c; 懂货的朋友可以直接下载该版本使用&#xff0c;经过严格测试&#xff0c;该版本基本完美无缺。 下载地址&#xff1a;…

【正点原子FreeRTOS学习笔记】————(4)FreeRTOS中断管理

这里写目录标题 一、什么是中断&#xff1f;&#xff08;了解&#xff09;二、中断优先级分组设置&#xff08;熟悉&#xff09;三、中断相关寄存器&#xff08;熟悉&#xff09;四、FreeRTOS中断管理实验&#xff08;掌握&#xff09; 一、什么是中断&#xff1f;&#xff08;…

华为数通 HCIP-Datacom H12-831 题库补充(3/27)

2024年 HCIP-Datacom&#xff08;H12-831&#xff09;最新题库&#xff0c;完整题库请扫描上方二维码&#xff0c;持续更新。 如图所示&#xff0c;关于R4路由器通过IS-IS计算出来的IPv6路由&#xff0c;哪一选项的描述是错误的&#xff1f; A&#xff1a;R4通过IS—IS只学习到…

【企业动态】吉利雷达汽车来访东胜物联,考察交流,洽谈车联网生态合作

近日&#xff0c;我们非常高兴接待吉利雷达汽车一行莅临东胜物联位于湖州市的生产工厂&#xff0c;进行参观考察&#xff0c;并就未来的合作展开深入商讨与交流。 雷达新能源汽车隶属于吉利控股集团&#xff0c;是一家专注于户外生态的中高端新能源智能汽车企业。雷达通过共享吉…

【启发式算法】同核分子优化算法 Homonuclear Molecules Optimization HMO算法【Matlab代码#70】

文章目录 【获取资源请见文章第4节&#xff1a;资源获取】1. 算法简介2. 部分代码展示3. 仿真结果展示4. 资源获取 【获取资源请见文章第4节&#xff1a;资源获取】 1. 算法简介 同核分子优化算法&#xff08;Homonuclear Molecules Optimization&#xff0c;HMO&#xff09;是…

网页版短信系统后台开发要点|短信平台软件开发搭建

在开发网页版短信系统的后台时&#xff0c;有一些关键要点需要注意&#xff0c;以确保系统的稳定性、安全性和高效性。以下是一些开发网页版短信系统后台时的重要要点&#xff1a; 用户管理&#xff1a;实现用户权限管理功能&#xff0c;包括用户注册、登录、角色分配等&#x…

Redis为什么快

引言 Redis是一个高性能的开源内存数据库,以其快速的读写速度和丰富的数据结构支持而闻名。作为一个轻量级、灵活的键值存储系统,Redis在各种应用场景下都展现出了惊人的性能优势。无论是作为缓存工具、会话管理组件、消息传递媒介,还是在实时数据处理任务和复杂的分布式系…

YOLOv9改进策略:卷积魔改 | SPD-Conv,低分辨率图像和小物体涨点明显

&#x1f4a1;&#x1f4a1;&#x1f4a1;本文改进内容&#xff1a;SPD-Conv由一个空间到深度(SPD)层和一个无卷积步长(Conv)层组成,特别是在处理低分辨率图像和小物体等更困难的任务时。 &#x1f4a1;&#x1f4a1;&#x1f4a1;SPD-Conv在多个数据集验证能够暴力涨点&#x…

python3字典的排序

创建一个字典 dict1{a:2,b:3,c:8,d:4} 1、分别取键、值 取字典的所有键&#xff0c;所有的值&#xff0c;利用dict1.keys()&#xff0c;dict1.vaules()&#xff0c; 由于键&#xff0c;值有很多个&#xff0c;所以要加s&#xff0c;另外注意这里要加括号&#xff0c;这样的小…

java spirng和 mybatis 常用的注解有哪些

当在Java Spring和MyBatis中进行开发时&#xff0c;常用的注解对于简化配置和提高开发效率非常重要。以下是更多常用的注解以及它们的详细说明和用途&#xff1a; 在Spring中常用的注解&#xff1a; Component&#xff1a; 用途&#xff1a;表明一个类会作为组件被Spring容器管…

YOLOv9改进策略:block优化 | Transformer架构ConvNeXt 网络在检测中大放异彩

&#x1f4a1;&#x1f4a1;&#x1f4a1;本文改进内容&#xff1a;Transformer架构 ConvNeXt 网络在图像分类和识别、分割领域大放异彩&#xff0c;同时对比 Swin-T 模型&#xff0c;在多种任务中其模型的大小和准确率均有一些提升&#xff0c;模型的 FLOPs 较大的减小且 Acc …

创建AI智能体

前言 灵境矩阵是百度推出的基于文心大模型的智能体&#xff08;Agent&#xff09;平台&#xff0c;支持广大开发者根据自身行业领域、应用场景&#xff0c;选取不同类型的开发方式&#xff0c;打造大模型时代的产品能力。开发者可以通过 prompt 编排的方式低成本开发智能体&am…

保姆级指导0基础如何快速搭建“对话机器人”类ChatGPT

参考了CDSN上的文章&#xff0c;但发现不work&#xff0c; 不是这里有问题&#xff0c;就是那里有问题&#xff0c;查阅了大量的资料&#xff0c;做了无数次试验&#xff0c;终于整理出来了一个完整的教程&#xff0c;保可用&#xff0c;保真~~~~~如果各位遇到什么问题&#xf…