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

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.

相关推荐
热点推荐
《我的叔叔于勒》主人公家里穷,却抱怨天天吃牛肉,这段却被删除了

《我的叔叔于勒》主人公家里穷,却抱怨天天吃牛肉,这段却被删除了

言过于诚
2026-10-07 12:05:04
刹车踏板断裂,实际用车恐怕比测试还要严苛

刹车踏板断裂,实际用车恐怕比测试还要严苛

柏铭锐谈
2026-10-10 14:55:06
“大闸蟹价格腰斩”冲上热搜,记者在南京实探:部分降幅超40%,供给放量是最直接原因

“大闸蟹价格腰斩”冲上热搜,记者在南京实探:部分降幅超40%,供给放量是最直接原因

上游新闻
2026-10-13 11:13:08
为何朝鲜逐渐疏远中国?又淡化中国援助,背后原因充满无奈与心酸

为何朝鲜逐渐疏远中国?又淡化中国援助,背后原因充满无奈与心酸

南书房
2026-09-01 11:40:18
劝告所有子女:再孝顺,也不要为年过80岁的老父老母,做这五件事

劝告所有子女:再孝顺,也不要为年过80岁的老父老母,做这五件事

枫红染山径
2026-10-06 11:26:52
谢贤前女友CoCo大曝张柏芝三胎生父内幕,无底线爆料,账号被封!

谢贤前女友CoCo大曝张柏芝三胎生父内幕,无底线爆料,账号被封!

寻墨阁
2026-03-06 13:57:52
北约爆发大规模抗议,要求赶走鲁比奥,与以色列断交

北约爆发大规模抗议,要求赶走鲁比奥,与以色列断交

磊子讲史
2026-10-10 14:25:51
支持率仅4.3%!知道自己提前淘汰后,郑丽文要为两岸关系定方向?

支持率仅4.3%!知道自己提前淘汰后,郑丽文要为两岸关系定方向?

攒一兜星星
2026-09-03 06:21:08
美媒排NBA20大分位!第1没争议,麦迪第12,韦德第3,哈登仅排第5名

美媒排NBA20大分位!第1没争议,麦迪第12,韦德第3,哈登仅排第5名

篮球圈里的那些事
2026-10-12 19:42:00
男子花3万买二手奥迪,洗车发现后排座椅高10公分,拆开直接报警

男子花3万买二手奥迪,洗车发现后排座椅高10公分,拆开直接报警

罪案洞察者
2025-07-14 16:05:54
谁也没有想到,凌晨一点的北京,72岁的濮存昕竟用一根布绳,将自己与94岁的老母亲系在了一起,这根绳子是重度阿尔茨海默症母亲的“警报器

谁也没有想到,凌晨一点的北京,72岁的濮存昕竟用一根布绳,将自己与94岁的老母亲系在了一起,这根绳子是重度阿尔茨海默症母亲的“警报器

回京历史梦
2026-10-11 16:30:12
296万元年薪总裁被留置,暴涨近200%的哈药股份一字跌停:无实控人药企的监督之问

296万元年薪总裁被留置,暴涨近200%的哈药股份一字跌停:无实控人药企的监督之问

华夏时报
2026-10-12 21:06:32
医院披露新毒物!多家厂商投毒,祸害婴幼儿,江浙沪已成重灾区

医院披露新毒物!多家厂商投毒,祸害婴幼儿,江浙沪已成重灾区

卷史
2026-10-10 13:28:37
马斯克回应中国版马斯克爆火:14亿里有个相似的很正常

马斯克回应中国版马斯克爆火:14亿里有个相似的很正常

界面新闻
2026-10-12 14:56:46
长征结束后,周恩来才向毛主席坦白一事,毛怒道:我当面问贺子珍

长征结束后,周恩来才向毛主席坦白一事,毛怒道:我当面问贺子珍

顾秋韵
2026-09-16 13:13:23
法国22岁女孩看完工资单,从革命青年变成了右翼

法国22岁女孩看完工资单,从革命青年变成了右翼

可达鸭面面观
2026-10-11 17:00:47
碾压孔蒂!曼联锁定世界级名帅,卡里克帅位岌岌可危!

碾压孔蒂!曼联锁定世界级名帅,卡里克帅位岌岌可危!

澜归序
2026-10-13 09:31:10
欧盟开始敌对中国,默茨马克龙公开表示:必要时将中国踢出欧盟市场

欧盟开始敌对中国,默茨马克龙公开表示:必要时将中国踢出欧盟市场

麓谷隐士
2026-10-12 00:05:04
没想到,央视《伟大的长征》开播仅仅两天,于和伟的口碑却反转了

没想到,央视《伟大的长征》开播仅仅两天,于和伟的口碑却反转了

白面书誏
2026-10-12 13:10:23
深耕西安城建几十年,薛建华为何栽在自己熟悉的领域?

深耕西安城建几十年,薛建华为何栽在自己熟悉的领域?

阿莱美食汇
2026-10-13 08:00:35
2026-10-13 12:47:00
moonfdd incentive-icons
moonfdd
福大大架构师每日一题
1511文章数 83关注度
往期回顾 全部

科技要闻

扎克伯格宣布追上OpenAI!Meta新模型亮相

头条要闻

男子买二手车口头价11万 交首付后发现贷款要还20多万

头条要闻

男子买二手车口头价11万 交首付后发现贷款要还20多万

体育要闻

走调的歌声里全是感情 最好的郑钦文尚未登场

娱乐要闻

小S女儿许曦文晒照片,形似大S

财经要闻

宜信终于还是爆雷了!最后的P2P大佬被抓

汽车要闻

小鹏G9L巴黎车展全球上市 法国市场售价74990欧元起

态度原创

房产
时尚
教育
本地
艺术

房产要闻

巨无霸来了!海口百亿大盘,正式动工!

从低谷到巅峰,她让中国网球等了二十年

教育要闻

雅思考试已连续四天取消,工作人员:晚上临时接到停考通知

本地新闻

踏访沙县第一村,寻国民小吃本源

艺术要闻

中国当代画家 尚丁油画作品选

无障碍浏览 进入关怀版