2026-10-04:最大有效数对和。用go语言,给定一个包含 n 个整数的数组 nums,以及一个整数 k。选取两个索引 i 和 j,要求 i 位于 j 的左侧,并且两个索引之间的差值不小于 k,也

发布时间:2026/10/5 13:16:39
2026-10-04:最大有效数对和。用go语言,给定一个包含 n 个整数的数组 nums,以及一个整数 k。选取两个索引 i 和 j,要求 i 位于 j 的左侧,并且两个索引之间的差值不小于 k,也 2026-10-04最大有效数对和。用go语言给定一个包含 n 个整数的数组 nums以及一个整数 k。选取两个索引 i 和 j要求 i 位于 j 的左侧并且两个索引之间的差值不小于 k也就是 j 减去 i 的结果至少为 k。对于所有满足这种要求的索引组合计算 nums[i] 与 nums[j] 的和最后返回这些和当中最大的那个值。2 n nums.length 100000。1 nums[i] 1000000000。1 k n - 1。输入 nums [1,3,5,2,8], k 2。输出 13。解释有效对为(0, 2): nums[0] nums[2] 6(0, 3): nums[0] nums[3] 3(0, 4): nums[0] nums[4] 9(1, 3): nums[1] nums[3] 5(1, 4): nums[1] nums[4] 11(2, 4): nums[2] nums[4] 13因此答案为 13 。题目来自力扣3979。具体过程可以分步骤理解初始化答案和左侧最大值用 ans 保存目前找到的最大有效数对和初始为 0。用 mx 保存当前所有合法左端点中的最大值初始也为 0。由于题目中 nums[i] 都是正数初始为 0 不会影响最终结果。右端点从 k 开始遍历因为要求 j - i k且 i 必须小于 j所以最小的右端点 j 至少是 k。因此循环让 j 从 k 一直走到数组最后一个位置。每次先扩大合法左端点范围当右端点移动到 j 时新变得合法的左端点是 j-k。也就是说之前 j 较小时位置 j-k 还不能作为左端点现在 j 增大了位置 j-k 满足 j - (j-k) k所以它可以被选为左端点了。于是把 nums[j-k] 纳入考虑范围并更新 mxmx 变成原来的 mx 和 nums[j-k] 中较大的那个。更新后mx 就代表从下标 0 到 j-k 这个范围内所有 nums[i] 的最大值。计算以当前 j 为右端点的最佳和当前右端点是 nums[j]左端点只需要选合法的最大值 mx。所以以 j 为右端点时最佳有效数对和就是 mx nums[j]。然后用这个和去更新全局答案 ans使 ans 始终保存目前遇到的最大值。遍历结束后返回 ans因为每个右端点 j 都计算了它对应的最佳左端点组合所以最终 ans 就是所有合法数对和中的最大值。以示例 nums [1, 3, 5, 2, 8]k 2 为例初始 ans 0mx 0。j 2把 nums[0] 1 纳入左端点候选mx 1。当前右端点是 nums[2] 5候选和为 1 5 6ans 6。j 3把 nums[1] 3 纳入左端点候选mx max(1, 3) 3。当前右端点是 nums[3] 2候选和为 3 2 5ans 仍为 6。j 4把 nums[2] 5 纳入左端点候选mx max(3, 5) 5。当前右端点是 nums[4] 8候选和为 5 8 13ans 更新为 13。循环结束返回 13。这个方法之所以正确是因为对于每一个右端点 j它都只关心合法左端点范围内最大的那个值。而随着 j 不断向右移动合法左端点范围只会扩大不会缩小所以可以用一个变量 mx 动态维护这个范围内的最大值不需要每次重新扫描。总的时间复杂度只对右端点 j 从 k 到 n-1 遍历一次每次只做常数次比较和加法因此时间复杂度是 O(n)。总的额外空间复杂度只使用了 ans、mx 等常数个变量没有额外开辟与数组规模相关的空间因此额外空间复杂度是 O(1)。如果算输入数组本身总空间是 O(n)但额外空间是 O(1)。Go完整代码如下packagemainimport(fmt)funcmaxValidPairSum(nums[]int,kint)(ansint){mx:0forj:k;jlen(nums);j{mxmax(mx,nums[j-k])// nums[i] 的最大值ansmax(ans,mxnums[j])}return}funcmain(){nums:[]int{1,3,5,2,8}k:2result:maxValidPairSum(nums,k)fmt.Println(result)}Python完整代码如下# -*-coding:utf-8-*-defmax_valid_pair_sum(nums,k):ans0mx0forjinrange(k,len(nums)):mxmax(mx,nums[j-k])# nums[i] 的最大值ansmax(ans,mxnums[j])returnansif__name____main__:nums[1,3,5,2,8]k2resultmax_valid_pair_sum(nums,k)print(result)C完整代码如下#includeiostream#includevector#includealgorithmintmaxValidPairSum(conststd::vectorintnums,intk){intans0;intmx0;intnstatic_castint(nums.size());for(intjk;jn;j){mxstd::max(mx,nums[j-k]);// nums[i] 的最大值ansstd::max(ans,mxnums[j]);}returnans;}intmain(){std::vectorintnums{1,3,5,2,8};intk2;intresultmaxValidPairSum(nums,k);std::coutresultstd::endl;return0;}

关于本文作者

来自尧图内容编辑团队

尧图内容编辑团队 内容团队

尧图内容编辑团队

本文由尧图网络内容编辑团队执笔。团队由资深项目经理、前端工程师与设计师组成,所有内容均来自亲手交付的真实项目,先讲清问题、再给出可落地的解法。尧图深耕北京网站建设十年,服务过京华建材集团、智造科技等各行业客户,把一线经验沉淀为可复用的行业观察。

  • 十年建站经验,覆盖建材、制造、服务、文创等
  • 项目经理把关选题与事实准确性
  • 工程师与设计师联合撰写专业细节
  • 统一编辑规范,保证文风与排版一致
  • 每月复盘转化数据,迭代选题方向

延伸阅读

相关资讯与近期热门内容

深度阅读推荐

建站决策前值得细读的三篇

网站改版的5个关键决策
2024-08-12

网站改版的5个关键决策

什么时候该改版、改到什么程度、如何避免流量掉光,京华建材集团改版复盘给出答案。

获取专属建站方案

看完文章,把您的行业与预算告诉我们,免费获取一份量身定制的官网建设方案与报价。

立即免费咨询