尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
解决leetcode第4017题数组中的峰值II
4017.数组中的峰值II难度困难问题描述给你一个长度为n的整数数组nums和一个二维整数数组queries。如果满足以下条件子数组nums[i..j]被称为峰值子数组其长度至少为3。存在一个下标k使得ikj且nums[k]nums[k-1]nums[k]nums[k1]你需要处理以下两种类型的查询[1,li,ri]计算完全包含在nums[li..ri]中的峰值子数组的数量。[2,indexi,vali]将nums[indexi]更新为vali。此更新适用于所有后续查询。返回一个数组answer其中answer[i]是按出现顺序排列的第i个类型1查询的答案。子数组是数组中连续的非空元素序列。示例1输入nums[1,3,2,4],queries[[1,0,3],[2,1,1],[1,0,3]]输出[2,0]解释查询[1,0,3][1,3,2]选择k1。则nums[k]3nums[k-1]1且nums[k1]2。因为31且32这是一个峰值子数组。[1,3,2,4]选择k1。则nums[k]3nums[k-1]1且nums[k1]2。因为31且32这是一个峰值子数组。查询[2,1,1]将nums[1]更新为1。数组变为[1,1,2,4]。查询[1,0,3]现在没有峰值子数组。因此answer[2,0]。示例2输入nums[9,8,9,8],queries[[1,1,3],[2,2,1],[1,0,2]]输出[1,0]解释查询[1,1,3]nums[1..3][8,9,8]选择k2。则nums[k]9nums[k-1]8且nums[k1]8。因为98且98这是一个峰值子数组。查询[2,2,1]将nums[2]更新为1。数组变为[9,8,1,8]。查询[1,0,2]没有峰值子数组。因此answer[1,0]。示例3输入nums[3,6,2,7,1],queries[[1,1,3],[2,3,0],[1,0,4]]输出[0,3]解释查询[1,1,3]唯一长度至少为3的子数组是[6,2,7]。其唯一可能的峰值下标是k2但nums[2]2小于nums[1]6和nums[3]7因此它不是一个峰值子数组。查询[2,3,0]将nums[3]更新为0。数组变为[3,6,2,0,1]。查询[1,0,4][3,6,2]选择k1。则nums[k]6nums[k-1]3且nums[k1]2。因为63且62这是一个峰值子数组。[3,6,2,0]选择k1。则nums[k]6nums[k-1]3且nums[k1]2。因为63且62这是一个峰值子数组。[3,6,2,0,1]选择k1。则nums[k]6nums[k-1]3且nums[k1]2。因为63且62这是一个峰值子数组。因此answer[0,3]。提示3nnums.length10**50nums[i]10**51queries.length10**5queries[i][1,li,ri]或queries[i][2,indexi,vali]0lirin-10indexin-10vali10**5分析问题解决下面几个小问题这道题也就迎刃而解了。一是对于一个数组先找出其中有多少个峰值把索引号0和峰值对应的索引号以及最后一个元素的索引号n-1以列表的形式返回如果中间没有峰值则返回空列表函数get_list_of_peak_index(nums1)实现这一功能二是对于只有一个峰值的数组nums2k[startpeakend]描述了一个查询如何把这个查询中的不同峰值子数组数量统计出来呢函数get_numbers_of_peak_sub_array(k,nums2)实现这一功能最后返回统计出来的峰值子数组数量t和不同的子数组列表temp三是处理第一种查询[1,li,ri]先根据查询取出对应的子数组然后查出子数组中的峰值列表把这个峰值对应的索引号列表比如[0,i1,i2,i3,......,in,n-1]分解成多个小部分[0,i1,i2]、[i1,i2,i3]、[i2,i3,i4]、......每一个部分只有一个峰值然后调用函数get_numbers_of_peak_sub_array(k,nums2)依次统计每个小部分中峰值子数组的数量最后将所有峰值子数组数量加起来就是这个查询对应的峰值子数组的总数量返回总数量和对应的峰值子数组列表temp四是处理第二种查询2,indexi,vali]函数get_changed_nums(query2,nums)实现了这一功能返回新的nums主程序根据查询序列queries依次取出查询调用相应的查询处理函数输出每次查询结果问题得到解决。程序如下#统计一个数组nums中峰值子数组的峰值索引号列表t并返回 def get_list_of_peak_index(nums1): t[0] nlen(nums1) for i in range(n-1): if nums1[i] nums1[i - 1] and nums1[i] nums1[i 1]: t.append(i) t.append(n-1) if len(t)3: return [] else: return t # 统计一个最大的峰值数组nums中峰值子数组的数量并返回 def get_numbers_of_peak_sub_array(k,nums2): nlen(nums2) startk[0] peakk[1] endk[2] t(peak-start)*(end-peak-1) temp[] for i in range(start,peak): for j in range(peak1,end): sub_arraynums2[i:j1] temp.append(sub_array) return t,temp #对查询[2,indexi,vali]的处理返回处理之后的nums def get_changed_nums(query2,nums): nums[query2[1]]query2[2] return nums #对查询[1,li,ri]的处理返回处理之后得到的完全包含其中的峰值子数组数量 def get_numbers_of_peak_subarray_by_query(query1,nums3): nums4nums3[query1[1]:query1[2]1] t get_list_of_peak_index(nums4) if not t: return 0,[] else: n 0 r len(t) temp[] for i in range(r - 2): a t[i] b t[i 1] c t[i 2] 1 k [a, b, c] m, e get_numbers_of_peak_sub_array(k, nums4) temp.extend(e) n m return n,temp #主程序 numseval(input(pls input nums)) queries eval(input(pls input queries)) t[] for query in queries: if query[0]1: n,aget_numbers_of_peak_subarray_by_query(query,nums) s有以下峰值子数组 if n!0 else 没有峰值子数组 print(f对于查询{query},{s}) if a: print(a) t.append(n) else: knums[::] numsget_changed_nums(query,nums) print(f对于查询{query},使得原数组{k}变为{nums}) print(answer ,t)运行实例一pls input nums[1,3,2,4]pls input queries[[1,0,3],[2,1,1],[1,0,3]]对于查询[1, 0, 3],有以下峰值子数组[[1, 3, 2], [1, 3, 2, 4]]对于查询[2, 1, 1],使得原数组[1, 3, 2, 4]变为[1, 1, 2, 4]对于查询[1, 0, 3],没有峰值子数组answer [2, 0]运行实例二pls input nums[9,7,9,7,9,2]pls input queries[[1,0,3],[2,1,10],[1,0,5]]对于查询[1, 0, 3],有以下峰值子数组[[9, 7, 9, 7], [7, 9, 7]]对于查询[2, 1, 10],使得原数组[9, 7, 9, 7, 9, 2]变为[9, 10, 9, 7, 9, 2]对于查询[1, 0, 5],有以下峰值子数组[[9, 10, 9], [9, 10, 9, 7], [9, 10, 9, 7, 9], [10, 9, 7, 9, 2], [9, 7, 9, 2], [7, 9, 2]]answer [2, 6]运行实例三pls input nums[3,6,2,7,1]pls input queries[[1,1,3],[2,3,0],[1,0,4]]对于查询[1, 1, 3],没有峰值子数组对于查询[2, 3, 0],使得原数组[3, 6, 2, 7, 1]变为[3, 6, 2, 0, 1]对于查询[1, 0, 4],有以下峰值子数组[[3, 6, 2], [3, 6, 2, 0], [3, 6, 2, 0, 1]]answer [0, 3]
RELATED

相关推荐

CSS架构方法论:ccs新世纪福音战士贰号机Ⅱ式实战解析

CSS架构方法论:ccs新世纪福音战士贰号机Ⅱ式实战解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

📅 2026/11/1 23:47:25
基于 C++ 实现勇闯迷宫游戏

基于 C++ 实现勇闯迷宫游戏

♻️ 资源 大小: 266KB ➡️ 资源下载:https://download.csdn.net/download/s1t16/87472201 勇闯迷宫游戏 1.分析 1.1 项目简介 迷宫只有两个门,一个门叫入口,另一个门叫出口。一个骑士骑马从入口进入迷宫,迷宫设…

📅 2026/9/9 9:17:33
mybatisplus实现sql

mybatisplus实现sql

家人们,有没有遇到这种情况,代码里面密密麻麻的sql,看的真的心累,太难维护和重塑了,实在是弄不懂这些人怎么想的,写的时候也不方便啊,要调用各种方法,代码量反而更多。

📅 2026/10/5 8:43:53
MORE NEWS

更多资讯

📰

启动报Port 8088 was already in use?先查是谁占的

启动报Port 8088 was already in use?先查是谁占的 项目启动报 Port 8088 was already in use,意思很直白:这个端口已经有人占了。 先说原理:端口是"门牌号",一间房只住一个进程 端口就是一台机器上的门牌号…

📰

担心文档上云?本地运行的办公AI才敢放心用

单位上周开了个会,主题是"AI 提效",散会时领导补了一句:涉及客户资料的文档,不许往云端传。这话一出,会议室里本来跃跃欲试的同事全蔫了——大家平时用的那些在线 AI,文档一上传就不知道存哪儿去…

📰

先能用,再好用:从烂尾复盘到两周上线,全栈项目的‘原型—快速迭代‘方法论

先能用,再好用:从烂尾复盘到两周上线,全栈项目的“原型—快速迭代”方法论 全栈学习路径的文章已经很多了:怎么选技术栈、怎么搭环境、怎么记文档,几乎每个方向都有人写。但一个更扎心的问题很少有人正面讨论——为什…

📰

深度思考模式把 ARC-AGI-2 从 17.6% 拉到 45.1%:对照 Gemini 3 Pro 的三份能力评测,看‘会思考‘改写了哪些边界

深度思考模式把 ARC-AGI-2 从 17.6% 拉到 45.1%:对照 Gemini 3 Pro 的三份能力评测,看“会思考”改写了哪些边界 一、先说结论:变强的不是“知识”,而是“解法” 每次新模型发布,评测榜单都会涨几个点,大…

📰

1.c++入门篇

1.c中的关键字asmdoifreturntrycontinueautodoubleinlineshorttypedefforbooldynamic_castintsignedtypeidpublicbreakelselongsizeoftypenamethrowcaseenummutablestaticunionwchar_tcatchexplicitnamespacestatic_castunsigneddefaultcharexportnewstructusingfriendclassext…

📰

《江灯合声》:有可行的分框版,也仍可以选择连续鸣谢

武汉江岸区栎坡合唱团在免费节目册《江灯合声》中,以表格集中鸣谢资助者。各家共同要求改为独立小框,团里仍想保留表格。现有全名与支持事项清楚可见,双方此前未承诺具体排版。我支持保留表格。补充的试排材料让选择更具体:分框能…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬