Leetcode 3357. Minimize the Maximum Adjacent Element Difference

  • Leetcode 3357. Minimize the Maximum Adjacent Element Difference
    • 1. 解题思路
    • 2. 代码实现
  • 题目链接:3357. Minimize the Maximum Adjacent Element Difference

1. 解题思路

这一题思路上和题目3356相似,同样是一个二分查找的题目,我们定义一个is_possible()函数来判断对于一个给定的 k k k,是否存在一个构造使得相邻两数的绝对差均不大于 k k k,然后二分查找最小的满足条件的 k k k即可。

但是在此之前,我们可以对原始数组进行一下简化,显然,如果有连续多个-1的情况,由于可选的数只有两个,因此,我们保留至多两个即可,其他我们总可以通过取同一个数字令其满足条件。另外,对于头尾的情况,我们保留至多一个-1即可,同理,在原始数组当中相同的相邻元素也可以直接过滤掉,保留一个即可,如此一来,我们即可简化一下数组。

然后,我们就只需要考察一下这个is_possible()函数的实现即可。

有关这个问题,我的实现思路是考察在给定的 k k k下,每一个位置可以填充的值的范围,然后得到一系列的范围之后对其进行归并,看其是否可以归并到至多两个数值区间内。此时,我们只要在这之多两个数值区间内各取一个,即可满足所有空白位置的要求。

当然,这里存在一个特例,即 A X X B AXXB AXXB的情况,我们需要特殊考察一下,因为它有以下两种构造方式:

  • 两数取值相同,此时就退化为了 A X B AXB AXB的情况,我们就只要考察 [ A − k , A + k ] ∩ [ l , r ] ∩ [ B − k , B + k ] [A-k, A+k] \cap [l, r] \cap [B-k, B+k] [Ak,A+k][l,r][Bk,B+k]不为空即可,其中 [ l , r ] [l, r] [l,r]是我们归并得到的取值区间。
  • 两数取值不同,即 A X Y B AXYB AXYB的情况,此时,我们不但各自需要 X , Y X, Y X,Y满足与 A , B A,B A,B各自的范围条件,且需要满足 X , Y X, Y X,Y之间的差值同样不超过 k k k

上述两条件满足其一,构造即可实现。

最后,我们将其翻译为代码语言即可。

2. 代码实现

给出python代码实现如下:

class Solution:def minDifference(self, nums: List[int]) -> int:def filter_nums(nums):ans = []cnt = 0pre = -1for num in nums:if num != -1:if num != pre:ans.append(num)cnt = 0elif cnt < 2:ans.append(num)cnt += 1pre = numif len(ans) >= 2 and ans[0] == -1 and ans[1] == -1:ans.pop(0)if len(ans) >= 2 and ans[-1] == -1 and ans[-2] == -1:ans.pop()return ansnums = filter_nums(nums)if len(nums) == 1:return 0n = len(nums)if Counter(nums)[-1] == 0:return max(abs(nums[i] - nums[i+1]) for i in range(n-1))def is_possible(k):ranges = []two_gap = []for i, x in enumerate(nums):if x != -1:if i-1 >= 0 and nums[i-1] != -1 and abs(x - nums[i-1]) > k:return Falseif i+1 < n and nums[i+1] != -1 and abs(x - nums[i+1]) > k:return Falseif x == -1:_min, _max = 1, math.infif i-1 >= 0 and nums[i-1] != -1:_min = max(_min, nums[i-1] - k)_max = min(_max, nums[i-1] + k)if i+1 < n and nums[i+1] != -1:_min = max(_min, nums[i+1] - k)_max = min(_max, nums[i+1] + k)if _min > _max:return Falseranges.append([_min, _max])if i-1 >= 0 and nums[i-1] == -1:two_gap.append(sorted([nums[i-2], nums[i+1]]))ranges = sorted(ranges)candidates = []_min, _max = ranges[0]for l, r in ranges:if l > _max:candidates.append([_min, _max])_min, _max = l, rif len(candidates) >= 2:return Falseelse:_min = max(_min, l)_max = min(_max, r)candidates.append([_min, _max])for x, y in two_gap:if any(y-k <= x+k and (x+k >= l or y-k <= r) for l, r in candidates):continueelif len(candidates) == 2 and candidates[0][1] <= x+k and candidates[1][0] >= y-k and candidates[1][0] - candidates[0][1] <= k:continueelse:return Falsereturn Trueif is_possible(0):return 0i, j = 0, max(nums) - min(nums)while j - i > 1:m = (i+j) // 2if is_possible(m):j = melse:i = mreturn j

提交代码评测得到:耗时4481ms,占用内存33.3MB。

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

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

相关文章

完整http服务器

目录 背景目标描述技术特点开发环境WWW客户端浏览发展史服务端http发展史http分层概览 背景 http协议被广泛使用&#xff0c;从移动端&#xff0c;pc浏览器&#xff0c;http无疑是打开互联网应用窗口的重要协议&#xff0c;http在网络应用层中的地位不可撼动&#xff0c;是能…

详细描述一下Elasticsearch搜索的过程?

大家好&#xff0c;我是锋哥。今天分享关于【详细描述一下Elasticsearch搜索的过程&#xff1f;】面试题。希望对大家有帮助&#xff1b; 详细描述一下Elasticsearch搜索的过程&#xff1f; Elasticsearch 的搜索过程是其核心功能之一&#xff0c;允许用户对存储在 Elasticsea…

springBoot插件打包部署

打包插件spring-boot-maven-plugin 不使用插件&#xff0c;运行时&#xff0c;异常信息为“没有主清单属性” 本地部署 杀进程

[ 网络安全介绍 1 ] 什么是网络安全?

&#x1f36c; 博主介绍 &#x1f468;‍&#x1f393; 博主介绍&#xff1a;大家好&#xff0c;我是 _PowerShell &#xff0c;很高兴认识大家~ ✨主攻领域&#xff1a;【渗透领域】【数据通信】 【通讯安全】 【web安全】【面试分析】 &#x1f389;点赞➕评论➕收藏 养成习…

无插件H5播放器EasyPlayer.js视频流媒体播放器如何开启electron硬解码Hevc(H265)

在数字化时代&#xff0c;流媒体播放器技术正经历着前所未有的变革。随着人工智能、大数据、云计算等技术的融合&#xff0c;流媒体播放器的核心技术不断演进&#xff0c;为用户提供了更加丰富和个性化的观看体验。 EasyPlayer.js H5播放器&#xff0c;是一款能够同时支持HTTP、…

阿里数字人工作 Emote Portrait Alive (EMO):基于 Diffusion 直接生成视频的数字人方案

TL;DR 2024 年 ECCV 阿里智能计算研究所的数字人工作&#xff0c;基于 diffusion 方法来直接的从音频到视频合成数字人&#xff0c;避免了中间的三维模型或面部 landmark 的需求&#xff0c;效果很好。 Paper name EMO: Emote Portrait Alive - Generating Expressive Portra…

Unity脚本基础规则

Unity脚本基础规则 如何在Unity中创建一个脚本文件&#xff1f; 在Project窗口中的Assets目录下&#xff0c;选择合适的文件夹&#xff0c;右键&#xff0c;选择第一个Create&#xff0c;在新出现的一栏中选择C# Script&#xff0c;此时文件夹内会出现C#脚本图标&#xff0c;…

基于YOLOv8深度学习的无人机航拍小目标检测系统(PyQt5界面+数据集+训练代码)

本研究提出并实现了一种基于YOLOv8深度学习模型的无人机航拍小目标检测系统&#xff0c;旨在解决高空环境下汽车目标检测的技术难题。随着无人机技术的发展&#xff0c;航拍图像已广泛应用于交通监控、城市管理、灾害应急等多个领域。然而&#xff0c;由于无人机通常在较高的飞…

Excel如何把两列数据合并成一列,4种方法

Excel如何把两列数据合并成一列,4种方法 参考链接:https://baijiahao.baidu.com/s?id=1786337572531105925&wfr=spider&for=pc 在Excel中,有时候需要把两列或者多列数据合并到一列中,下面介绍4种常见方法,并且提示一些使用注意事项,总有一种方法符合你的要求:…

VSCode自定义插件创建教程

文章目录 一、前言二、插件维护三、调试插件四、使用 vsce 生成 vsix 插件五、问题&#xff1a;打开调试窗口后&#xff0c;输入helloworld并没有指令提示六、插件创建实战七、拓展阅读 一、前言 对于前端程序猿来讲&#xff0c;最常用的开发利器中VSCode首当其冲&#xff0c;…

HarmonyOS Next 关于页面渲染的性能优化方案

HarmonyOS Next 关于页面渲染的性能优化方案 HarmonyOS Next 应用开发中&#xff0c;用户的使用体验至关重要。其中用户启动APP到呈现页面主要包含三个步骤&#xff1a; 框架初始化页面加载布局渲染 从页面加载到布局渲染中&#xff0c;主要包含了6个环节&#xff1a; 执行页…

深度学习之目标检测的技巧汇总

1 Data Augmentation 介绍一篇发表在Big Data上的数据增强相关的文献综述。 Introduction 数据增强与过拟合 验证是否过拟合的方法&#xff1a;画出loss曲线&#xff0c;如果训练集loss持续减小但是验证集loss增大&#xff0c;就说明是过拟合了。 数据增强目的 通过数据增强…

记录下,用油猴Tampermonkey监听所有请求,绕过seesion

油猴Tampermonkey监听所有请求&#xff0c;绕过seesion 前因后果脚本编写 前因后果 原因是要白嫖一个网站的接口&#xff0c;这个接口的页面入口被隐藏掉了&#xff0c;不能通过页面调用&#xff0c;幸好之前有想过逆向破解通过账号密码模拟登录后拿到token&#xff0c;请求该…

百度遭初创企业指控抄袭,维权还是碰瓷?

“ 抄袭指控引发网友热议&#xff0c;有人支持其立场&#xff0c;也有人认为工具类产品在界面设计上相似度高是行业常态。 ” 转载|科技新知 原创 作者丨晓伊 编辑丨蕨影 一年一度的百度世界大会刚刚落幕&#xff0c;一家初创企业却站出来公开指责百度抄袭自家产品&#xff…

golang通用后台管理系统09(系统操作日志记录)

1.日志工具类 package log/**** 日志记录 wangwei 2024-11-18 15:30*/ import ("log""os""path/filepath""time" )// 获取以当前日期命名的日志文件路径 func getLogFilePath() string {currentDate : time.Now().Format("2006-…

迁移学习理论与应用

迁移学习&#xff08;Transfer Learning&#xff09;是一种机器学习技术&#xff0c;旨在将一个任务&#xff08;源任务&#xff09;上学到的知识迁移到另一个相关但不完全相同的任务&#xff08;目标任务&#xff09;上&#xff0c;从而提高目标任务的学习效果。这种方法的核心…

Azure Kubernetes Service (AKS)资源优化策略

针对Azure Kubernetes Service (AKS)的资源优化策略&#xff0c;可以从多个维度进行考虑和实施&#xff0c;以提升集群的性能、效率和资源利用率。以下是一些关键的优化策略&#xff1a; 一、 Pod资源请求和限制 设置Pod请求和限制&#xff1a;在YAML清单中为所有Pod设置CPU和…

Vue3 虚拟列表组件库 virtual-list-vue3 的使用

Vue3 虚拟列表组件库 virtual-list-vue3 的基本使用 分享个人写的一个基于 Vue3 的虚拟列表组件库&#xff0c;欢迎各位来进行使用与给予一些更好的建议&#x1f60a; 概述&#xff1a;该组件组件库用于提供虚拟化列表能力的组件&#xff0c;用于解决展示大量数据渲染时首屏渲…

qt之QFTP对文件夹(含嵌套文件夹和文件)、文件删除下载功能

一、前言 主要功能如下&#xff1a; 1.实现文件夹的下载和删除&#xff0c;网上很多资料都是单独对某个路径的文件操作的&#xff0c;并不能对文件夹操作 2.实现目标机中含中文名称自动转码&#xff0c;有些系统编码方式不同&#xff0c;下载出来的文件会乱码 3.实现ftp功能…

SpringBoot登录功能实现思路(验证码+拦截器+jwt)

总括 用户输入用户名和密码和验证码即可进行登录 验证码 VerifyCode&#xff1a;生成验证码的工具类 /*** 生成验证码的工具类*/ public class VerifyCode {private int w 70;//设置缓冲区的宽private int h 35;//设置缓冲区的宽private Random r new Random();//从字体…