牛客NC357 矩阵第K小【中等 堆 Java、Go、PHP】

题目

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

核心

堆,或者叫优先级队列

参考答案Java

import java.util.*;public class Solution {/*** 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可*** @param matrix int整型ArrayList<ArrayList<>>* @param k int整型* @return int整型*/public int KthinMatrix (ArrayList<ArrayList<Integer>> matrix, int k) {//优先级队列int n = matrix.size(); //行和列都是nboolean[][] visited = new boolean[n][n];PriorityQueue<int[]> pq = new PriorityQueue<>(new Comparator<int[]>() {public int compare(int[] a,int[] b) { //int[]:0:横坐标x  1:纵坐标y  2:xy对应的位置值return matrix.get(a[0]).get(a[1]) - matrix.get(b[0]).get(b[1]);}});int[] root = {0, 0, matrix.get(0).get(0)};visited[0][0] = true;pq.add(root);for (int i = 0; i < k - 1 ; i++) {int[] cur = pq.poll();int x = cur[0];int y = cur[1];if (x < n && y + 1 < matrix.get(x).size() && !visited[x][y + 1]) {visited[x][y + 1] = true;pq.add(new int[] {x, y + 1, matrix.get(x).get(y + 1)});}if (x + 1 < n && y < matrix.get(x).size() && !visited[x + 1][y]) {visited[x + 1][y] = true;pq.add(new int[] {x + 1, y, matrix.get(x + 1).get(y)});}}return pq.poll()[2];}}

参考答案Go

package main/*** 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可*** @param matrix int整型二维数组* @param k int整型* @return int整型*/
func KthinMatrix(matrix [][]int, k int) int {//优先级队列,堆n := len(matrix)visited := make([][]bool, n)for i := 0; i < n; i++ {visited[i] = make([]bool, n)}pq := &MyPQ{make([]PQNode, 10), 0, 10}pq.add(0, 0, matrix[0][0])visited[0][0] = truefor i := 0; i < k-1; i++ {poll := pq.poll()x := poll.xy := poll.yif x < n && y+1 < n && !visited[x][y+1] { //题目说了矩阵n*npq.add(x, y+1, matrix[x][y+1])visited[x][y+1] = true}if x+1 < n && y < n && !visited[x+1][y] {pq.add(x+1, y, matrix[x+1][y])visited[x+1][y] = true}}return pq.poll().data
}// 本答案用小顶堆,从上往下递增
type PQNode struct {x    int //横坐标y    int //纵坐标data int //坐标值
}
type MyPQ struct {arr         []PQNodesize        intdefaultSize int
}func (pq *MyPQ) ensureCap(cap int) { //堆的扩容curlen := len(pq.arr)if curlen >= cap {return}newlen := curlen + curlen>>1newarr := make([]PQNode, newlen)for i := 0; i < curlen; i++ {newarr[i] = pq.arr[i]}pq.arr = newarr
}func (pq *MyPQ) add(x, y, data int) {pq.ensureCap(pq.size + 1)node := PQNode{x, y, data}pq.arr[pq.size] = nodepq.shiftup(pq.size)pq.size++}// 上滤
func (pq *MyPQ) shiftup(idx int) {root := pq.arr[idx]for idx > 0 {pidx := (idx - 1) >> 1pdata := pq.arr[pidx]if pdata.data < root.data {break}pq.arr[idx] = pdataidx = pidx}pq.arr[idx] = root
}// 获取并删除堆顶元素,然后下窜,整理堆
func (pq *MyPQ) poll() PQNode {root := pq.arr[0]//fmt.Println("root:", root.data)pq.arr[0] = pq.arr[pq.size-1]pq.size -= 1pq.shiftdown(0)return root
}func (pq *MyPQ) shiftdown(idx int) {root := pq.arr[idx]half := pq.size >> 1 //核心1: 用位移,别用除法for idx < half {childidx := (idx << 1) + 1 //核心2: 用位移,别用乘法rightidx := childidx + 1child := pq.arr[childidx]//小顶堆,哪个子节点更小,哪边就上去if rightidx < pq.size && pq.arr[childidx].data > pq.arr[rightidx].data {childidx = rightidxchild = pq.arr[rightidx]}if child.data >= root.data {break}pq.arr[idx] = childidx = childidx}pq.arr[idx] = root
}

参考答案PHP

<?php/*** 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可** * @param matrix int整型二维数组 * @param k int整型 * @return int整型*/
function KthinMatrix( $matrix ,  $k )
{// 堆,优先级队列$pq = new PQ();$n =count($matrix);$visited = [];for($i=0;$i<$n;$i++){for($j=0;$j<$n;$j++){$visited[$i][$j] =false;}}$pq->add(0,0,$matrix[0][0]);$visited[0][0]= true;for($i=0;$i<$k-1;$i++){$poll = $pq->poll();$x = $poll[0];$y = $poll[1];if($x <$n && $y+1<$n && !$visited[$x][$y+1]){$pq->add($x,$y+1,$matrix[$x][$y+1]);$visited[$x][$y+1]=true;}if($x+1<$n&&$y<$n && !$visited[$x+1][$y]){$pq->add($x+1,$y,$matrix[$x+1][$y]);$visited[$x+1][$y]=true;}}return $pq->poll()[2];
}//本答案用对,小顶对,也就是从上往下是递增的
class PQ{public $arr=[]; //二维数组,0:横坐标 1:纵坐标  2:坐标值public $defaultsize =10;public $size;public function __construct(){$this->size =0;for($i=0;$i<$this->defaultsize;$i++){$this->arr[$i] =[];}}public function ensurecap($cap){$curlen =count($this->arr);if($curlen >= $cap){return;}$newlen = $curlen+$curlen>>1;$newarr = [];for($i=0;$i<$newlen;$i++){if($i<$curlen){$newarr[$i] = $this->arr[$i];}else{$newarr[$i] =[];}}$this->arr = $newarr;}public function  add($x,$y,$data){$this->ensurecap($this->size+1);$this->arr[$this->size] = [$x,$y,$data];$this->shiftup($this->size);$this->size++;}//上滤public function shiftup($idx){$root = $this->arr[$idx];while ($idx>0){$pidx = ($idx-1) >>1;$parent= $this->arr[$pidx];if($parent[2] <=$root[2]){ //当前节点比父节点大,退出break;}$this->arr[$idx] = $parent;$idx = $pidx;}$this->arr[$idx] = $root;}public function poll() {$root = $this->arr[0];$this->arr[0] = $this->arr[$this->size-1];$this->size-=1;$this->shiftdown(0);return $root;}//下窜public function shiftdown($idx){$root = $this->arr[$idx];$half = $this->size >>1;while ($idx<$half){$childidx = ($idx << 1)+1;$rightidx = $childidx+1;$child = $this->arr[$childidx];if($rightidx<$this->size && $child[2] > $this->arr[$rightidx][2]){$childidx = $rightidx;$child = $this->arr[$rightidx];}if($child[2] >=$root[2]){break;}$this->arr[$idx] = $child;$idx =$childidx;}$this->arr[$idx] = $root;}
}

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

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

相关文章

【网站项目】“最多跑一次”小程序

&#x1f64a;作者简介&#xff1a;拥有多年开发工作经验&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的项目或者毕业设计。 代码可以私聊博主获取。&#x1f339;赠送计算机毕业设计600个选题excel文件&#xff0c;帮助大学选题。赠送开题报告模板&#xff…

微软如何打造数字零售力航母系列科普01 --- Azure顾问(AZURE Advisor)简介

Azure顾问&#xff08;AZURE Advisor&#xff09;简介 目录 一、什么是AZURE顾问&#xff08;AZURE Advisor&#xff09;&#xff1f; 二、常见问题 三、接下来的步骤 一、什么是AZURE顾问&#xff1f; AZURE顾问是一种数字云助手&#xff0c;可帮助您遵循最佳实践来优化Az…

Java面试八股之marshalling和demarshalling

marshalling和demarshalling Marshalling&#xff08;序列化&#xff09;是将内存中的对象状态转化为适合传输或存储的格式&#xff08;如字节流、JSON、XML&#xff09;&#xff0c;以便进行网络通信、持久化存储或跨平台/语言交互操作。Demarshalling&#xff08;反序列化&a…

Java Record

Java Record 1.Java Record的作用与特性2.Java Record 如何使用创建和使用RecordRecord 的 MethodRecord 的构造方法Record 的 extends 和 implements 3.Record 和 Lombok4.Record类和java.lang.Class类5.instanceof判断Record类型6.Local Record与嵌套Record Java14 中预览(Ja…

深度学习-优化策略

1.使用众所周知的梯度下降法。 &#xff08;1&#xff09;.批量梯度下降法&#xff1a;每次参数更新使用所有的样本&#xff08;2&#xff09;.随机梯度下降法&#xff1a;每次参数更新只使用一次样本&#xff08;3&#xff09;.小批量梯度下降法&#xff1a;每次参数更新使用…

20.Unity飞机大战游戏

1任务&#xff1a;使背景图动起来 2任务&#xff1a;飞机换帧动画 3任务&#xff1a;让飞机发射子弹 4任务&#xff1a;敌机出现 5任务&#xff1a;控制飞机 6任务&#xff1a;游戏碰撞逻辑 7任务&#xff1a;另外两种类型的敌机 8任务&#xff1a;拾取奖励物品换枪 9…

强固型工业电脑在码头智能闸口、OCR(箱号识别)、集装箱卡车车载电脑行业应用

集装箱卡车车载电脑应用 背景介绍 针对码头集装箱卡车的调度运用, 结合码头TOS系统设计出了各种平台的车载电脑(VT系列)和车载LED显示屏(VLD系列)&#xff0c;同时提供各种安装支架&#xff0c;把车载电脑固定到狭小的驾驶室中&#xff1b;同时提供了各种天线选择&#xff08;…

【Linux】NFS网络文件系统搭建

一、服务端配置 #软件包安装 [roothadoop01 ~]# yum install rpcbind nfs-utils.x86_64 -y [roothadoop01 ~]# mkdir /share#配置文件修改 #格式为 共享资源路径 [主机地址] [选项] # [roothadoop01 ~]# vi /etc/exports /share 192.168.10.0/24(rw,sync,no_root_squash) #…

VBA技术资料MF144:将PDF首页作为对象插入工作表

我给VBA的定义&#xff1a;VBA是个人小型自动化处理的有效工具。利用好了&#xff0c;可以大大提高自己的工作效率&#xff0c;而且可以提高数据的准确度。“VBA语言専攻”提供的教程一共九套&#xff0c;分为初级、中级、高级三大部分&#xff0c;教程是对VBA的系统讲解&#…

神经网络中的神经元和激活函数介绍

文章目录 1、什么是人工神经网络 2、什么是神经元 3、什么是激活函数 线性激活函数 Sigmoid激活函数 双曲正切激活函数 修正线性单元&#xff08;ReLU&#xff09;激活函数 Leaky ReLU激活函数 Softmax激活函数 1、什么是人工神经网络 神经网络能够利用多层神经元学习复杂的模…

AlDente Pro for mac最新激活版:电池长续航软件

AlDente Pro是一款专为Mac用户设计的电池管理工具&#xff0c;旨在提供电池安全和健康管理的一站式解决方案。它具备实时监控电池状态的功能&#xff0c;让用户随时了解电池的电量、充电次数、健康状态等信息。 AlDente Pro for mac最新激活版下载 同时&#xff0c;AlDente Pro…

使用Python进行云计算:AWS、Azure、和Google Cloud的比较

&#x1f47d;发现宝藏 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。【点击进入巨牛的人工智能学习网站】。 使用Python进行云计算&#xff1a;AWS、Azure、和Google Cloud的比较 随着云计算的普及&am…