牛客NC404 最接近的K个元素【中等 二分查找+双指针 Java/Go/PHP】

题目

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

知识点

	二分查找;找到第一个大于等于x的数的位置idx;然后从idx开始往两边扩展

Java代码

import java.util.*;public class Solution {/*** 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可*** @param nums int整型ArrayList* @param k int整型* @param x int整型* @return int整型ArrayList*/public ArrayList<Integer> closestElement (ArrayList<Integer> nums, int k,int x) {//二分+双指针int n = nums.size();int right = firstGt(nums, x);int left = right - 1;ArrayList<Integer> ans = new ArrayList<>();LinkedList<Integer> ll = new LinkedList<>();if (right == 0) {for (int i = 0; i < k ; i++) {ll.add(nums.get(i));}} else if (right == n - 1) {for (int i = n - 1 - k; i < n ; i++) {ll.add(nums.get(i));}} else {while (left >= 0 || right < n) {int diffleft = -1;int diffright = -1;if (left >= 0) {diffleft = x - nums.get(left);}if (right < n) {diffright = nums.get(right) - x;}if (diffleft != -1 && diffright != -1) {if (diffleft <= diffright) {ll.addFirst(nums.get(left--));} else {ll.addLast(nums.get(right++));}} else if (diffleft != -1) {ll.addFirst(nums.get(left--));} else if (diffright != -1) {ll.addLast(nums.get(right++));}if (ll.size() == k)break;}}return new ArrayList<>(ll);}//找到大于等于x的下标位置public int firstGt(ArrayList<Integer> nums, int x) {int n = nums.size();int left = 0;int right = n;while (left < right) {int m = left + (right - left) / 2;if (nums.get(m) > x) {right = m - 1;} else if (nums.get(m) < x) {left = m + 1;} else {return m;}}return left;}
}

Go代码

package main//import "fmt"/*** 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可*** @param nums int整型一维数组* @param k int整型* @param x int整型* @return int整型一维数组*/
func closestElement(nums []int, k int, x int) []int {//二分+双指针n := len(nums)right := firstGt(nums, x)arrleft := []int{}arrright := []int{}ans := []int{}if right == 0 {for i := 0; i < k; i++ {ans = append(ans, nums[i])}} else if right == n-1 {for i := n - 1 - k; i < n; i++ {ans = append(ans, nums[i])}} else {left := right - 1cnt := 0for left >= 0 || right < n {diffleft := -1diffright := -1if left >= 0 {diffleft = x - nums[left]}if right < n {diffright = nums[right] - x}if diffleft != -1 && diffright != -1 {if diffleft <= diffright {arrleft = append(arrleft, nums[left])left--} else {arrright = append(arrright, nums[right])right++}} else if diffleft != -1 {arrleft = append(arrleft, nums[left])left--} else if diffright != -1 {arrright = append(arrright, nums[right])right++}cnt++if cnt == k {for i := len(arrleft) - 1; i >= 0; i-- {ans = append(ans, arrleft[i])}for i := 0; i < len(arrright); i++ {ans = append(ans, arrright[i])}break}}}return ans
}//找到大等于x的位置
func firstGt(nums []int, x int) int {n := len(nums)left := 0right := n - 1for left < right {m := left + (right-left)/2if nums[m] > x {right = m - 1} else if nums[m] < x {left = m + 1} else {return m}}return left
}

PHP代码

<?php/*** 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可** * @param nums int整型一维数组 * @param k int整型 * @param x int整型 * @return int整型一维数组*/
function closestElement( $nums ,  $k ,  $x )
{// 二分+双指针$n = count($nums);$right = firstGt($nums,$x);$ans = [];$arrleft=[];$arrright =[];if($right ==0 ){for($i=0;$i<$k;$i++){$ans[$i] = $nums[$i];}}else if($right ==$n-1){for($i=$n-1-$k;$i>=0;$i++){$ans[count($ans)] = $nums[$i];}}else {$left = $right-1;$cnt =0;while ($left>=0 || $right < $n){$diffleft=-1;$diffright =-1;if($left>=0) {$diffleft = $x-$nums[$left];}if($right<$n){$diffright = $nums[$right]-$x;}if($diffleft!=-1 && $diffright!=-1){if($diffleft<=$diffright){$arrleft[count($arrleft)] = $nums[$left--];}else{$arrright[count($arrright)] = $nums[$right++];}}else if($diffleft!=-1){$arrleft[count($arrleft)] = $nums[$left--];}else if($diffright!=-1){$arrright[count($arrright)] = $nums[$right++];}$cnt++;if($cnt==$k){for($i=count($arrleft)-1;$i>=0;$i--){$ans[count($ans)] = $arrleft[$i];}for($i=0;$i<count($arrright);$i++){$ans[count($ans)] = $arrright[$i];}break;}}}return $ans;
}//找到大于等于x的位置
function firstGt($nums,$x){$n = count($nums);$left =0;$right = $n;while ($left<$right){$m = $left+(($right-$left)>> 1);if($nums[$m] > $x){$right = $m-1;}else if($nums[$m] < $x){$left = $m+1;}else{return $m;}}return $left;
}

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

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

相关文章

可观测性监控

1 目的 常见的监控&#xff0c;主要是以收集数据以识别异常系统效应为主&#xff0c;多是单个服务&#xff0c;相互独立的状态。 可观测性&#xff0c;希望调查异常系统效应的根本原因&#xff0c;能够把多个服务、中间件、容器等串联起来&#xff0c;同时柔和metrics、log、…

vue3.0(六) toRef,toValue,toRefs和toRow,markRaw

文章目录 toReftoValuetoRefstoRowmarkRawtoRef和toRefs的区别toRaw 和markRaw的用处 toRef toRef 函数可以将一个响应式对象的属性转换为一个独立的 ref 对象。返回的是一个指向源对象属性的 ref 引用&#xff0c;任何对该引用的修改都会同步到源对象属性上。使用 toRef 时需…

2024年最新趋势跨境电商平台开发需了解的新技术

随着数字化技术的不断演进和全球市场的日益融合&#xff0c;跨境电商平台开发将面临前所未有的挑战和机遇。为了更好地适应并引领这一发展&#xff0c;开发者需要密切关注2024年最新的技术趋势&#xff0c;以确保他们的平台能够在竞争激烈的市场中脱颖而出。本文将对跨境电商平…

HTML/CSS2

1.前置说明 HTML/CSS1 2.img元素 格式&#xff1a; <img src"图片地址" alt"占位文字" width"图片宽度" height"图片高度">其中alt是当图片加载失败时显示的文字 而且不同内核的浏览器显示出来的占位文字的效果也是不尽相同…

网安面经之文件上传漏洞

一、文件上传漏洞 1、文件上传漏洞的原理&#xff1f;危害&#xff1f;修复&#xff1f; 原理&#xff1a;⽂件上传漏洞是发⽣在有上传功能的应⽤中&#xff0c;如果应⽤程序对⽤户上传的⽂件没有控制或者存在缺陷&#xff0c;攻击者可以利⽤应⽤上传功能存在的缺陷&#xff…

从文本日志到图形日志 图形化编程桌面产品的突破

在一个宽敞明亮的会议室里&#xff0c;阳光透过落地窗洒在会议桌上。卧龙和凤雏相对而坐&#xff0c;他们的面前摆放着一些关于图形化编程桌面产品的资料和测试报告。会议室里的气氛紧张而热烈&#xff0c;团队成员们围坐在一起&#xff0c;专注地倾听着卧龙和凤雏的讨论。 卧龙…

单位学校FM调频电台直放站系统

随着教育技术的不断发展&#xff0c;校园广播系统的建设已成为现代学校必不可少的一部分。作为传统有线广播的有效补充&#xff0c;基于无线电信号传输的 FM 调频电台在学校的使用日益广泛&#xff0c;尤其是在紧急通知、日常信息传播及教学辅助等方面发挥着重要作用。为了增强…

韩顺平0基础学Java——第9天

p169-201 数组&#xff08;第六章&#xff09; 数组扩容 此时原来的数组arr被销毁。 牛蛙&#xff1a; 最后再加一句 SYstem。out。println&#xff08;“是否添加&#xff1f;”&#xff09;&#xff1b; char key myscanner。netx&#xff08;&#xff09;。charAT&…

【Python超详细的学习笔记】Python超详细的学习笔记,涉及多个领域,是个很不错的笔记

获取笔记链接 Python超详细的学习笔记 一&#xff0c;逆向加密模块 1&#xff0c;Python中运行JS代码 1.1 解决中文乱码或者报错问题 import subprocess from functools import partial subprocess.Popen partial(subprocess.Popen, encodingutf-8) import execjs1.2 常用…

WordPress插件Plus WebP,可将jpg、png、bmp、gif图片转为WebP

现在很多浏览器和CDN都支持WebP格式的图片了&#xff0c;不过我们以前的WordPress网站使用的图片都是jpg、png、bmp、gif&#xff0c;那么应该如何将它们转换为WebP格式的图片呢&#xff1f;推荐安装这款Plus WebP插件&#xff0c;可以将上传到媒体库的图片转为WebP格式图片&am…

HIVE调优MapJoin

HIVE调优MapJoin 目录 HIVE调优MapJoin 1.mapjoin &#xff08;1.2以后自动默认启动mapjoin&#xff09; 2.创建表格 3.查询建表 4.通过 explain 展示执行计划 5.Map JOIN 相关设置&#xff1a; 1.mapjoin &#xff08;1.2以后自动默认启动mapjoin&#xff09;…

[机器学习-05] Scikit-Learn机器学习工具包进阶指南:协方差估计和交叉分解功能实战【2024最新】

&#x1f3a9; 欢迎来到技术探索的奇幻世界&#x1f468;‍&#x1f4bb; &#x1f4dc; 个人主页&#xff1a;一伦明悦-CSDN博客 ✍&#x1f3fb; 作者简介&#xff1a; C软件开发、Python机器学习爱好者 &#x1f5e3;️ 互动与支持&#xff1a;&#x1f4ac;评论 &…

设计模式-结构型-桥接模式-Bridge

桥接模式可以减少类的创建 矩阵类 public class Matrix {private String fileName;public Matrix(String fileName) {this.fileName fileName;}public String getFileName() {return fileName;} } 图片抽象类 public abstract class Image {protected ImageImp imp;public …

常见算法策略

前言 算法策略是指在解决问题或完成任务时所采用的方法、技巧或步骤的总称。 在设计算法时&#xff0c;通常会考虑多种策略&#xff0c;并选择最适合特定问题的策略来实现算法的设计和优化。 算法策略比较 动态规划 动态规划介绍入口

动手学深度学习16 Pytorch神经网络基础

动手学深度学习16 Pytorch神经网络基础 1. 模型构造2. 参数管理1. state_dict()2. normal_() zeros_()3. xavier初始化共享参数的好处 3. 自定义层4. 读写文件net.eval() 评估模式 QA 1. 模型构造 定义隐藏层–模型结构定义前向函数–模型结构的调用 import torch from torch…

Xilinx 千兆以太网TEMAC IP核 MDIO 配置及物理接口

基于AXI4-Lite接口可以访问MDIO(Management Data Input/Output)接口&#xff0c;而MDIO接口连接MAC外部的PHY芯片&#xff0c;用户可通过AXI4-Lite接口实现对PHY芯片的配置。 1 MDIO接口简介 开放系统互连模型OSI的最低两层分别是数据链路层和物理层&#xff0c;数据链路层的…

联丰策略股票炒股APP市场这些板块爆发!A股后市怎么走?

查查配5月10日,A股三大指数涨跌不一。 联丰策略拥有一支由知名互联网公司和国内证券金融机构的行业专家组成的一流运营团队。凭借他们在互联网产品开发和金融风险管理方面的丰富经验,我们的团队致力于为客户提供专业和个性化的证券交易服务。 截至收盘,沪指涨0.01%,报3154.55点…

leetcode-矩阵最长递增路径-102

题目要求 思路 1.通过双循环去把每一个结点作为起始点进行统计&#xff0c;将返回的路径长度存放在res中&#xff0c;取最大的res的长度。 2.递归中需要的几个值&#xff0c;x和y当前结点的坐标&#xff0c;pre用于存储上一个结点的元素值&#xff0c;因为要求是路径上的元素是…

FreeRtos内核源码分析(九)——协程

目录 一、协程简介 二、协程工作机制 2.1 协程控制块结构 2.2 协程管理方式 2.3 协程调度方式 2.4 协程通信机制 三、协程状态及状态切换 3.1 协程状态 3.2 状态切换 四、协程创建 五、协程调度分析 5.1 源码分析 5.2 逻辑图分析 六、协程通信 6.1 协程发送消息…

通过acl设置阻止数据包通过

实验拓扑和信息如图&#xff08;配置信息参考上一章内容&#xff09; acl设置代码 AR4 系统是视图下 acl 2000 rule 5 deny source 10.10.10.1 0 接口0视图下 数据接收时 traffic-filter inbound acl 2000 测试结果