2026/6/20 10:03:30
网站建设
项目流程
相亲网站男人拉我做外汇,中国知名公司,专业网站建设设计公司,阿里巴巴国际站买家版app2026-01-11#xff1a;三段式数组Ⅱ。用go语言#xff0c;给定长度为 n 的整数序列 nums#xff0c;要求选出一个包含至少四个元素的连续区间 [a, b]#xff08;0 ≤ a b n#xff09;#xff0c;并在区间内选两个切分点 a i j b#xff0c;使…2026-01-11三段式数组Ⅱ。用go语言给定长度为 n 的整数序列 nums要求选出一个包含至少四个元素的连续区间 [a, b]0 ≤ a b n并在区间内选两个切分点 a i j b使得区间被分成三段第一段从 a 到 i 元素严格上升第二段从 i 到 j 元素严格下降第三段从 j 到 b 元素又严格上升。在所有满足此模式的连续区间中找出其元素和的最大值并返回该最大和。4 n nums.length 100000。-1000000000 nums[i] 1000000000。保证至少存在一个三段式子数组。输入: nums [1,4,2,7]。输出: 14。解释:选择 l 0, p 1, q 2, r 3nums[l…p] nums[0…1] [1, 4] 严格递增 (1 4)。nums[p…q] nums[1…2] [4, 2] 严格递减 (4 2)。nums[q…r] nums[2…3] [2, 7] 严格递增 (2 7)。和 1 4 2 7 14。题目来自力扣3640。 算法步骤详解初始化阶段算法定义了四个关键变量并赋予它们一个极小的初始值negInf约为最小整数的一半以防止后续加法运算时溢出ans用于记录遍历过程中找到的满足条件的最大子数组和。f1动态规划状态变量追踪当前可能处于**第一段严格递增**的序列的最大和。f2动态规划状态变量追踪当前可能处于**第二段严格递减**的序列的最大和。f3动态规划状态变量追踪当前可能处于**第三段严格递增**的序列的最大和。遍历与状态转移算法从数组的第二个元素开始遍历i从 1 到len(nums)-1。在每一步它比较当前元素y即nums[i]和前一个元素x即nums[i-1]并根据大小关系更新三个状态变量情况一x y上升趋势这种情况可能意味着延续第一段的上升或者开启第三段的上升。更新f3第三段f3可以从上一状态f3延续第三段或f2第二段结束开始第三段转移过来并加上当前元素y。然后用这个新的f3值尝试更新全局最大和ans。更新f1第一段f1可以从其上一状态延续并加上y这表示第一段在延长。重置f2由于出现了上升趋势任何正在构建的第二段下降段必须中断因此将f2重置为negInf。情况二x y下降趋势这种情况可能意味着从第一段过渡到第二段或者延续第二段的下降。更新f2第二段f2可以从其上一状态延续或者从f1第一段结束开始第二段转移过来并加上当前元素y。重置f1和f3一旦进入下降趋势之前可能的第一段和第三段状态变得无效因此将f1和f3重置为negInf。情况三x y相等元素根据题目要求每一段都必须是“严格”单调的。因此只要出现相邻元素相等当前正在构建的任何三段式模式都会立即失效。完全重置状态将f1,f2,f3全部重置为negInf表示需要重新开始寻找有效的序列模式。结果返回在遍历完整个数组后变量ans中存储的就是所有满足条件的三段式连续子数组的最大和算法将其转换为int64类型后返回。⏱️ 复杂度分析时间复杂度O(n)算法仅对输入数组nums进行了一次线性遍历循环内的所有操作比较、加法、取最大值都是常数时间O(1)。因此总的时间复杂度与数组长度n成线性关系为O(n)。额外空间复杂度O(1)算法在执行过程中仅使用了固定数量的额外变量ans,f1,f2,f3,i,x,y。这些变量的数量不随输入数组的大小n而变化。因此额外的空间复杂度是常数阶O(1)。Go完整代码如下packagemainimport(fmtmath)funcmaxSumTrionic(nums[]int)int64{constnegInfmath.MinInt/2// 除 2 防止下面加法和负数相加溢出ans,f1,f2,f3:negInf,negInf,negInf,negInffori:1;ilen(nums);i{x,y:nums[i-1],nums[i]ifxy{// 第一段或者第三段f3max(f3,f2)y ansmax(ans,f3)f2negInf f1max(f1,x)y}elseifxy{// 第二段f2max(f2,f1)y f1,f3negInf,negInf}else{f1,f2,f3negInf,negInf,negInf}}returnint64(ans)}funcmain(){nums:[]int{1,4,2,7}result:maxSumTrionic(nums)fmt.Println(result)}Python完整代码如下# -*-coding:utf-8-*-defmaxSumTrionic(nums):NEG_INF-10**18# 使用一个足够小的负数避免溢出ansf1f2f3NEG_INFforiinrange(1,len(nums)):x,ynums[i-1],nums[i]ifxy:# 第一段或者第三段f3max(f3,f2)y ansmax(ans,f3)f2NEG_INF f1max(f1,x)yelifxy:# 第二段f2max(f2,f1)y f1f3NEG_INFelse:f1f2f3NEG_INFreturnansif__name____main__:nums[1,4,2,7]resultmaxSumTrionic(nums)print(result)C完整代码如下#includeiostream#includevector#includeclimits#includealgorithmusingnamespacestd;longlongmaxSumTrionic(vectorintnums){constlonglongNEG_INFLLONG_MIN/2;// 除 2 防止加法溢出longlongansNEG_INF,f1NEG_INF,f2NEG_INF,f3NEG_INF;for(size_t i1;inums.size();i){intxnums[i-1],ynums[i];if(xy){// 第一段或者第三段f3max(f3,f2)y;ansmax(ans,f3);f2NEG_INF;f1max(f1,(longlong)x)y;}elseif(xy){// 第二段f2max(f2,f1)y;f1f3NEG_INF;}else{f1f2f3NEG_INF;}}returnans;}intmain(){vectorintnums{1,4,2,7};longlongresultmaxSumTrionic(nums);coutresultendl;return0;}