网易首页 > 网易号 > 正文 申请入驻

2026-05-10:找到带限制序列的最大值。用go语言,给定一个整数 n、一个二维整数数组 restrictions、以及一个长度为 n-1 的数组 ...

0
分享至

2026-05-10:找到带限制序列的最大值。用go语言,给定一个整数 n、一个二维整数数组 restrictions、以及一个长度为 n-1 的数组 diff。你需要生成一个长度为 n 的非负整数序列 a[0…n-1],使得:

  • • a[0] 固定为 0。

  • • 对于每个 i(0 ≤ i ≤ n-2),相邻项差的绝对值不超过给定限制:|a[i] - a[i+1]| ≤ diff[i]。

  • • 对于 restrictions 中的每一项 [idx, maxVal],都要保证对应位置满足:a[idx] ≤ maxVal。

在所有满足上述条件的序列中,你的目标是让序列里的“最大元素值”尽可能大。最终输出这个最大元素值的最优结果。

2 <= n <= 100000。

1 <= restrictions.length <= n - 1。

restrictions[i].length == 2。

restrictions[i] = [idx, maxVal]。

1 <= idx < n。

1 <= maxVal <= 1000000。

diff.length == n - 1。

1 <= diff[i] <= 10。

restrictions[i][0] 的值是唯一的。

输入: n = 10, restrictions = [[3,1],[8,1]], diff = [2,2,3,1,4,5,1,1,2]。

输出: 6。

解释:

序列 a = [0, 2, 4, 1, 2, 6, 2, 1, 1, 3] 满足给定的限制条件(a[3] <= 1 且 a[8] <= 1)。

序列中的最大值为 6。

题目来自力扣3796。

详细步骤

我会完全脱离代码,用纯文字、分步骤把整个解题过程讲清楚,同时最后给出时间和空间复杂度。

一、先明确题目核心规则

我们要构造一个长度为n的序列a,满足:

  1. 1. 起点固定:a[0] = 0

  2. 2. 相邻约束:|a[i] - a[i+1]| ≤ diff[i](相邻两个数的差值绝对值不能超过对应diff值)

  3. 3. 点位约束:指定下标idx的值必须 ≤ 给定的maxVal

  4. 4. 目标:在所有合法序列中,让整个序列的最大值尽可能大,求这个最大可能值

二、整体解题思路(核心:两次遍历 + 约束融合)

整个算法的核心逻辑是:
先从左到右推导出每个位置能达到的理论最大值,再从右到左修正所有违反相邻约束和点位约束的值,最终得到合法的最优序列,再取最大值。

下面是分步骤详细过程

步骤1:初始化所有位置的「硬上限」

  1. 1. 给序列的每一个位置0~n-1都设置一个初始最大允许值,默认是无穷大(表示暂时没有限制)。

  2. 2. 遍历所有的restrictions点位约束:

  • • 把对应下标的硬上限直接修改为题目给定的maxVal

  • • 比如约束[3,1],就把位置3的硬上限设为1;[8,1]就把位置8的硬上限设为1。

  • • 其他没有约束的位置,上限保持无穷大。

这一步的作用:先把所有固定的点位限制记下来,后续推导不能超过这些值

步骤2:从左到右遍历,计算「左向最大可能值」

从起点a[0]=0开始,向右依次计算每个位置能达到的最大理论值

  1. 1. 起点固定:a[0] = 0

  2. 2. 对于第i+1个位置:

  • • 它的理论最大值= 左边位置i的值 + 相邻允许的最大增量diff[i]

  • • 同时不能超过该位置的硬上限(步骤1设置的值)

  • • 最终取两者中的较小值作为当前位置的左向最大值

这一步的逻辑:只能向右走,每次最多加diff[i],同时不能碰点位限制
这一步结束后,得到的序列满足:

  • • 从左到右的相邻约束

  • • 所有点位硬上限约束

  • • 但不满足从右到左的相邻约束(右边的值可能太大,导致和左边的差值超标)

步骤3:从右到左遍历,修正序列为「完全合法值」

从最后一个位置开始,向左依次修正每个位置的值,让序列同时满足左右双向的相邻约束

  1. 1. 从倒数第二个位置开始,向左遍历到第1个位置

  2. 2. 对于当前位置i

  • • 它的最大合法值= 右边位置i+1的值 + 相邻允许的最大增量diff[i]

  • • 同时不能超过步骤2算出的左向最大值

  • • 最终取两者中的较小值作为当前位置的最终值

这一步的作用:修正左到右推导时,右侧值过大导致的左侧不合法问题,让整个序列同时满足:

  • • 起点固定

  • • 所有相邻双向约束

  • • 所有点位约束

  • • 且序列中的每个值都是当前约束下能取到的最大值(保证整体最大值最优)

步骤4:计算最终结果

遍历修正后的完整序列,找出其中的最大值,就是题目要求的答案。

三、用题目示例验证过程(直观理解)

输入:

  • n=10,序列长度10

  • • 约束:[3,1][8,1]

  • diff = [2,2,3,1,4,5,1,1,2]

步骤1:设置硬上限

位置:0 1 2 3 4 5 6 7 8 9
上限:∞ ∞ ∞ 1 ∞ ∞ ∞ ∞ 1 ∞

步骤2:左→右推导(取最大理论值)

  • • a[0] = 0

  • • a[1] = min(0+2, ∞) = 2

  • • a[2] = min(2+2, ∞) = 4

  • • a[3] = min(4+3, 1) = 1(受约束限制)

  • • a[4] = min(1+1, ∞) = 2

  • • a[5] = min(2+4, ∞) = 6

  • • a[6] = min(6+5, ∞) = 11

  • • a[7] = min(11+1, ∞) = 12

  • • a[8] = min(12+1, 1) = 1(受约束限制)

  • • a[9] = min(1+2, ∞) = 3

左→右结果:[0,2,4,1,2,6,11,12,1,3]
(这个序列不合法:比如12和1的差值远超diff限制)

步骤3:右→左修正(得到合法序列)

从右往左依次修正,让相邻差值合规:
最终得到合法最优序列:[0,2,4,1,2,6,2,1,1,3]
(和题目解释的序列完全一致)

步骤4:取最大值

序列最大值 = 6 → 就是答案。

四、时间复杂度 & 额外空间复杂度 1. 总时间复杂度

整个过程只涉及三次线性遍历

  1. 1. 初始化上限数组:O(n)

  2. 2. 左→右遍历:O(n)

  3. 3. 右→左遍历:O(n)

  4. 4. 求序列最大值:O(n)

所有操作都是和序列长度n成正比的线性操作,没有嵌套循环。
总时间复杂度:O(n)

2. 总额外空间复杂度

我们额外开辟了两个数组:

  1. 1. 存储每个位置硬上限的数组:长度n

  2. 2. 存储最终序列的数组:长度n

其他变量都是常数级空间,不随n变化。
总额外空间复杂度:O(n)

总结

  1. 1. 解题分四步:初始化点位上限 → 左向右推最大理论值 → 右向左修正合规值 → 取序列最大值

  2. 2. 核心是通过两次遍历同时满足所有约束,并让序列最大值最优;

  3. 3. 时间复杂度:O(n)(线性效率,适合n≤10万的大数据量);

  4. 4. 额外空间复杂度:O(n)(用两个长度为n的辅助数组完成计算)。

Go完整代码如下:

package main

import (
"fmt"
"math"
"slices"
)

func findMaxVal(n int, restrictions [][]int, diff []int)int {
maxVal := make([]int, n)
for i := range maxVal {
maxVal[i] = math.MaxInt
}
for _, r := range restrictions {
maxVal[r[0]] = r[1]
}

a := make([]int, n)
for i, d := range diff {
a[i+1] = min(a[i]+d, maxVal[i+1])
}
for i := n - 2; i > 0; i-- {
a[i] = min(a[i], a[i+1]+diff[i])
}
return slices.Max(a)
}

func main() {
n := 10
restrictions := [][]int{{3, 1}, {8, 1}}
diff := []int{2, 2, 3, 1, 4, 5, 1, 1, 2}
result := findMaxVal(n, restrictions, diff)
fmt.Println(result)
}

Python完整代码如下:

# -*-coding:utf-8-*-

import math

def find_max_val(n, restrictions, diff):
max_val = [math.inf] * n
for r in restrictions:
max_val[r[0]] = r[1]

a = [0] * n
for i, d in enumerate(diff):
a[i + 1] = min(a[i] + d, max_val[i + 1])
for i in range(n - 2, 0, -1):
a[i] = min(a[i], a[i + 1] + diff[i])
return max(a)

if __name__ == "__main__":
n = 10
restrictions = [[3, 1], [8, 1]]
diff = [2, 2, 3, 1, 4, 5, 1, 1, 2]
result = find_max_val(n, restrictions, diff)
print(result)

C++完整代码如下:

  




using namespace std;

int findMaxVal(int n, vector int >>& restrictions, vector< int >& diff) {
vector< int > maxVal(n, INT_MAX);
for (auto& r : restrictions) {
maxVal[r[ 0 ]] = r[ 1 ];
}

vector< int > a(n, 0 );
for ( int i = 0 ; i < diff.size(); i++) {
a[i + 1 ] = min(a[i] + diff[i], maxVal[i + 1 ]);
}

for ( int i = n - 2 ; i > 0 ; i--) {
a[i] = min(a[i], a[i + 1 ] + diff[i]);
}

return *max_element(a.begin(), a.end());
}

int main() {
int n = 10 ;
vector int >> restrictions = {{ 3 , 1 }, { 8 , 1 }};
vector< int > diff = { 2 , 2 , 3 , 1 , 4 , 5 , 1 , 1 , 2 };
int result = findMaxVal(n, restrictions, diff);
cout << result << endl;
return 0 ;
}

我们相信人工智能为普通人提供了一种“增强工具”,并致力于分享全方位的AI知识。在这里,您可以找到最新的AI科普文章、工具评测、提升效率的秘籍以及行业洞察。 欢迎关注“福大大架构师每日一题”,发消息可获得面试资料,让AI助力您的未来发展。

特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相关推荐
热点推荐
第一次感受到维C的“杀伤力”,2块钱一瓶,就能搞定8个麻烦事

第一次感受到维C的“杀伤力”,2块钱一瓶,就能搞定8个麻烦事

室内设计师有料儿
2026-05-09 10:26:26
世界杯还没开踢,中国球迷先“退票”了

世界杯还没开踢,中国球迷先“退票”了

每日经济新闻
2026-05-11 22:56:12
经济复苏的三个标志

经济复苏的三个标志

生命可以承受之轻
2026-05-11 09:05:02
中国在美伊开战后石油日进口减少25%,但库存创新高,还将部分石油出售

中国在美伊开战后石油日进口减少25%,但库存创新高,还将部分石油出售

爆角追踪
2026-05-12 09:20:42
上海地铁打人爆火!两老人施暴女孩,官方怒批倚老卖老,追责难逃

上海地铁打人爆火!两老人施暴女孩,官方怒批倚老卖老,追责难逃

奇思妙想草叶君
2026-05-12 02:14:56
Shams:雄鹿已正式公开字母哥交易报价并开启谈判

Shams:雄鹿已正式公开字母哥交易报价并开启谈判

懂球帝
2026-05-12 08:09:15
东北一男子养鹿破产,赌气放生了30头鹿,8年后上山,眼前一幕却让他泪崩了...

东北一男子养鹿破产,赌气放生了30头鹿,8年后上山,眼前一幕却让他泪崩了...

背包旅行
2026-05-11 14:51:09
72岁外长王毅冒雨单膝一跪,这一跪,跪出了大国的脊梁!

72岁外长王毅冒雨单膝一跪,这一跪,跪出了大国的脊梁!

奇思妙想生活家
2026-05-12 07:28:32
阿根廷公布世界杯55人大名单:迪巴拉无缘!上届5位冠军成员落选

阿根廷公布世界杯55人大名单:迪巴拉无缘!上届5位冠军成员落选

我爱英超
2026-05-11 21:12:05
国际足联彻底翻脸!

国际足联彻底翻脸!

阿振观点
2026-05-12 05:45:05
骑士112-103活塞,米切尔创4项纪录!谁是赢球功臣?数据不会说谎

骑士112-103活塞,米切尔创4项纪录!谁是赢球功臣?数据不会说谎

毒舌NBA
2026-05-12 10:51:31
亚历山大回应罚球争议!追梦力挺SGA:没本事赢他就闭嘴

亚历山大回应罚球争议!追梦力挺SGA:没本事赢他就闭嘴

罗说NBA
2026-05-12 05:57:07
维修资金成了“提款机”?上海一小区物业被曝疯狂敛财:1.3万修个插头,300元椅子敢报1000

维修资金成了“提款机”?上海一小区物业被曝疯狂敛财:1.3万修个插头,300元椅子敢报1000

观威海
2026-05-11 21:54:14
天津一广场“胸口碎大石”表演锤头突然脱把飞出一孩童被砸,当地政府:小朋友没什么大问题

天津一广场“胸口碎大石”表演锤头突然脱把飞出一孩童被砸,当地政府:小朋友没什么大问题

观威海
2026-05-11 21:50:11
贵阳女子1880元办不限次数的瑜伽季卡,连上20多天课后被教练踢出群聊:天天来,你不累吗?

贵阳女子1880元办不限次数的瑜伽季卡,连上20多天课后被教练踢出群聊:天天来,你不累吗?

观威海
2026-05-11 20:46:40
21岁双胞胎姐妹1死1重伤,凶手为妹妹男友,案发前数小时双方在派出所调解,家属起诉警方失职;嫌犯作案当天发布动态:狠角色我只扮演一次

21岁双胞胎姐妹1死1重伤,凶手为妹妹男友,案发前数小时双方在派出所调解,家属起诉警方失职;嫌犯作案当天发布动态:狠角色我只扮演一次

大风新闻
2026-05-12 08:55:33
1-1!热刺痛失好局+无缘3连胜 保级悬念仍在:剩2轮领先西汉姆2分

1-1!热刺痛失好局+无缘3连胜 保级悬念仍在:剩2轮领先西汉姆2分

我爱英超
2026-05-12 06:27:23
彭加木被找到了!知情人:DNA专家说99%就是彭加木,但有个遗憾!

彭加木被找到了!知情人:DNA专家说99%就是彭加木,但有个遗憾!

拳击时空
2026-05-12 05:55:35
国际乒联发林诗栋跳上球桌视频,日本网友炸了:非常无礼必须处罚

国际乒联发林诗栋跳上球桌视频,日本网友炸了:非常无礼必须处罚

杨华评论
2026-05-11 14:30:27
关窗!关灯!深圳多地突然大量出现,头皮发麻!网友崩溃:住30几层都逃不掉

关窗!关灯!深圳多地突然大量出现,头皮发麻!网友崩溃:住30几层都逃不掉

南方都市报
2026-05-12 08:03:14
2026-05-12 11:07:00
moonfdd incentive-icons
moonfdd
福大大架构师每日一题
1221文章数 67关注度
往期回顾 全部

科技要闻

纳德拉法庭爆料:拒当“AI时代的IBM”

头条要闻

牛弹琴:特朗普要来了 可以肯定这不是一次寻常的访问

头条要闻

牛弹琴:特朗普要来了 可以肯定这不是一次寻常的访问

体育要闻

梁靖崑:可能是最后一届了,想让大家记住这个我

娱乐要闻

刘涛晒妈祖诞辰活动照 评论区变许愿池

财经要闻

特朗普要来了,我们且淡定

汽车要闻

吉利银河“TT”申报图曝光 电动尾翼+激光雷达

态度原创

艺术
旅游
教育
亲子
公开课

艺术要闻

这位画家的油画美人让人惊叹不已!

旅游要闻

“李子出山”到“民宿出圈”!看清镇站街的“短视频+”融合之道

教育要闻

高考想要本科直接就业,该如何报考

亲子要闻

从“流动”到“安心”:一位宝妈的“定点”幸福

公开课

李玫瑾:为什么性格比能力更重要?

无障碍浏览 进入关怀版