Leetcode 3357. Minimize the Maximum Adjacent Element Difference

server/2024/11/18 15:59:02/
  • 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.ppmy.cn/server/142945.html

相关文章

go 集成swagger 在线接口文档

安装swaggo go install github.com/swaggo/swag/cmd/swaglatest 编写swag import ("github.com/gin-gonic/gin""goWeb/internal/service""goWeb/model/response" )// UserRouter 路由 func UserRouter(ctx *gin.RouterGroup) {ctx.GET("/…

QT学习——一个简单的串口助手

从本篇开始&#xff0c;将会记录自己关于QT开发相关的学习记录以及demo 今天分享的是如何使用QT开发一个简单的串口助手 开发环境 Ubantu18.0.4 QT5.12 1.配置文件中增加serialport模块 MyApplication.pro QT core gui serialport 2.绘制布局 如下图所示 布局代码…

libcurl.net入门使用

libcurl.net入门使用 关于libcurl.net 一个引用libcurl.dll并封装为.NET使用的Curl库&#xff0c;方便在.NET应用程序里面执行Curl命令&#xff0c;没有其他库依赖&#xff0c;只是对libcurl.dll的封装和引用。 在大多数情况下&#xff0c;我们可以或者比较容易获取Web请求的…

Ubuntu安装配置MySQL(远程登录)

Ubuntu安装配置MySQL 好多命令每次都忘&#xff0c;还要在网上查&#xff0c;在这里留一份&#xff0c;方便自己日后查看 步骤 1: 更新软件包列表 首先&#xff0c;打开终端并更新你的软件包列表&#xff0c;确保你拥有最新的软件包信息&#xff1a; sudo apt update步骤 2…

Essential Cell Biology--Fifth Edition--Chapter one (8)

1.1.4.6 The Cytoskeleton [细胞骨架] Is Responsible for Directed Cell Movements 细胞质基液不仅仅是一种无结构的化学物质和细胞器的混合物[soup]。在电子显微镜下&#xff0c;我们可以看到真核细胞的细胞质基液是由长而细的丝交叉而成的。通常[Frequently]&#xff0c;可…

STM32 | 空气净化器

空气净化器 一、项目背景 空气净化器又称“空气清洁器”、空气清新机、净化器&#xff0c;是指能够吸附、分解或转化各种空气污染物&#xff08;一般包括PM2.5、粉尘、花粉、异味、甲醛之类的装修污染、细菌、过敏原等&#xff09;&#xff0c;有效提高空气清洁度的产品&…

python语言基础-5 进阶语法-5.2 装饰器-5.2.2 简单装饰器

声明&#xff1a;本内容非盈利性质&#xff0c;也不支持任何组织或个人将其用作盈利用途。本内容来源于参考书或网站&#xff0c;会尽量附上原文链接&#xff0c;并鼓励大家看原文。侵删。 5.2.2 简单装饰器 装饰器的形式就是一个闭包&#xff0c;下面是一个简单的定义并使用…

微信小程序进行md5加密 ,base64 转码

封装一个Md5加密的工具 &#xff1a; utils /md5.js function md5(string) { function md5_RotateLeft(lValue, iShiftBits) { return (lValue << iShiftBits) | (lValue >>> (32 - iShiftBits)); } function md5_AddUnsigned(lX, lY) { var lX4, lY4, l…