news 2026/10/17 6:52:37

2026-10-16:交替数列的最大元素。用go语言,给定三个整数 n、s、m。现在要构造一个包含 n 个整数的序列,其中第一个数必须等于 s。序列中相邻数字的大小关系要不断反转:可以从“下降、上升、

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
2026-10-16:交替数列的最大元素。用go语言,给定三个整数 n、s、m。现在要构造一个包含 n 个整数的序列,其中第一个数必须等于 s。序列中相邻数字的大小关系要不断反转:可以从“下降、上升、

2026-10-16:交替数列的最大元素。用go语言,给定三个整数 n、s、m。现在要构造一个包含 n 个整数的序列,其中第一个数必须等于 s。序列中相邻数字的大小关系要不断反转:可以从“下降、上升、下降”这样开始,也可以从“上升、下降、上升”这样开始,之后一直交替下去。同时,任意两个相邻数字之间的差距都不能超过 m。如果序列只有一个数字,则它自然满足交替要求。问:在所有满足这些条件的序列中,某个位置上的数字最大可能达到多少?请给出这个最大可能值。

1 <= n, s <= 1000000000。

1 <= m <= 100000。

输入: n = 4, s = 3, m = 5。

输出: 12。

解释:

一个有效的序列是 [3, 8, 7, 12]。

序列中的最大元素是 12。

题目来自力扣3993。

大体步骤如下:

第一步:处理长度为 1 的特殊情况

如果 n 等于 1,那么序列只有一个元素,且题目规定长度为 1 的序列天然满足交替要求。此时首项就是 s,没有其他元素,所以可能出现的最大元素就是 s。代码中直接返回 s。

第二步:确定最优的起始方向

当 n 大于 1 时,序列至少有两个元素。为了让后面的元素尽可能大,应该选择从“上升”开始,而不是从“下降”开始。因为如果一开始就下降,首项 s 会成为第一个峰值,后面的元素从更低的位置开始上升,很难超过从 s 直接上升到最大值的情况。因此最优策略是让第二个元素比 s 大,并且尽量取到允许的最大差距 m。于是第二个元素最大可以取到 s + m。

第三步:安排后续的下降和上升

第二个元素达到 s + m 后,根据交替规则,第三个元素必须小于第二个元素。为了让后面再次上升时能达到更高的峰值,第三个元素不能下降太多,而应该尽可能大。由于是整数序列,并且必须严格小于前一个元素,所以第三个元素最大只能取到第二个元素减 1,即 s + m - 1。

接着第四个元素需要大于第三个元素,并且差距不超过 m。为了让最大值尽可能大,第四次变化应该取到允许的最大上升幅度 m。于是第四个元素可以取到:
第三个元素 + m = (s + m - 1) + m = s + 2m - 1。

继续下去,第五个元素必须小于第四个元素,为了后续能继续上升,它应该取第四个元素减 1,即 s + 2m - 2。第六个元素再上升 m,得到 s + 3m - 2,以此类推。

第四步:总结最大值的增长规律

从第二个元素开始,每经过一次“下降再上升”的完整循环,峰值大约增加 m - 1。更准确地说:

  • 第二个元素是第一个峰,值为 s + m。
  • 之后每多一个峰,值就增加 m - 1。
  • 在长度为 n 的序列中,从第二个位置开始算,峰的位置是第 2、4、6、……个元素。
  • 这样的峰一共有 n 整除 2 个。
  • 第一个峰已经包含在 s + m 中,所以还需要额外增加 n 整除 2 再减 1 次。

因此最大可能值为:
s + m + (m - 1) × (n 整除 2 - 1)。

代码中的逻辑正是:如果 n 等于 1,返回 s;否则返回 s + m + (m - 1) × (n / 2 - 1)。这里的 n / 2 是整数除法。

第五步:代入样例验证

题目给出的样例是 n = 4,s = 3,m = 5。

  • n 不等于 1,所以走一般情况。
  • n 整除 2 等于 2。
  • n 整除 2 再减 1 等于 1。
  • s + m = 3 + 5 = 8。
  • m - 1 = 4。
  • 最终结果 = 8 + 4 × 1 = 12。

这正好对应输出 12。一个有效的序列是 [3, 8, 7, 12],其中最大元素是 12。验证过程也符合前面的构造:3 上升到 8,8 下降到 7,7 再上升到 12,每一步的差分别是 5、1、5,都没有超过 m = 5,并且大小关系交替变化。

第六步:复杂度分析

代码中只进行了有限次判断和算术运算,没有任何循环,也没有使用额外的数组或数据结构。

  • 总时间复杂度:O(1),即常数时间。
  • 总额外空间复杂度:O(1),即常数空间。

因此,无论 n、s、m 多大,计算最大可能值都只需要常数次操作。

Go完整代码如下:

packagemainimport("fmt")funcmaximumValue(n,s,mint)int64{ifn==1{returnint64(s)}returnint64(s+m+(m-1)*(n/2-1))}funcmain(){n:=4s:=3m:=5result:=maximumValue(n,s,m)fmt.Println(result)}

Python完整代码如下:

# -*-coding:utf-8-*-defmaximum_value(n:int,s:int,m:int)->int:ifn==1:returnsreturns+m+(m-1)*(n//2-1)if__name__=="__main__":n=4s=3m=5result=maximum_value(n,s,m)print(result)

C++完整代码如下:

#include<iostream>longlongmaximumValue(intn,ints,intm){if(n==1){returnstatic_cast<longlong>(s);}returnstatic_cast<longlong>(s)+m+static_cast<longlong>(m-1)*(n/2-1);}intmain(){intn=4;ints=3;intm=5;longlongresult=maximumValue(n,s,m);std::cout<<result<<std::endl;return0;}

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/17 6:52:31

Vue组件封装实战:从props、插槽到分页表格的完整指南

做了几年前端&#xff0c;我几乎每天都在跟 Vue 打交道。从最开始照着官方文档写 Todo List&#xff0c;到后来维护几十万行代码的后台系统&#xff0c;我发现在 Vue 世界里&#xff0c;组件就是一切的地基。很多开发者学完语法、会写页面&#xff0c;但一到自己动手封装一个基…

作者头像 李华
网站建设 2026/10/17 6:51:18

爆肝一个月,Java 从入门到精通01 - 简介及发展史

为什么要学Java&#xff1f; 因为Java是全球排名第一的编程语言&#xff0c;Java工程师也是市场需求最大的软件工程师&#xff0c;选择Java&#xff0c;就是选择了高薪。 为什么Java应用最广泛&#xff1f; 从互联网到企业平台&#xff0c;Java是应用最广泛的编程语言&#…

作者头像 李华
网站建设 2026/10/17 6:51:10

真正做工程项目要用的技能,已经29 万Star

需求刚讲完一半&#xff0c;AI 已经把代码写完了。跑起来报错&#xff0c;让它修&#xff0c;它改了三个文件&#xff0c;报错换了个样式。来回四轮&#xff0c;你可能开始怀疑自己描述得不够清楚&#xff0c;下次还是一样。mattpocock/skills 对这个循环给的解释是&#xff1a…

作者头像 李华
网站建设 2026/10/17 6:50:43

EMUI8开机执行sh脚本:修改ramdisk与init.rc的完整指南

做 Android 系统定制的人&#xff0c;应该都碰到过这类需求&#xff1a;手上的设备跑的是 EMUI8&#xff08;某厂商基于 Android 8.x 开源系统深度定制的 ROM&#xff09;&#xff0c;希望在设备每次开机时自动执行一段 sh 脚本。可能是要调整内核参数、挂载额外分区、拉一个本…

作者头像 李华