2026-03-16:转换数组的最少操作次数。用go语言,给定两个整数数组:第一个长度为 n,第二个长度为 n+1。你可以对第一个数组反复施行三类操作中的任意一种——选择一个下标 i,使该位置的元素加
2026-03-16转换数组的最少操作次数。用go语言给定两个整数数组第一个长度为 n第二个长度为 n1。你可以对第一个数组反复施行三类操作中的任意一种——选择一个下标 i使该位置的元素加 1、或减 1、或将该位置当前的值复制并追加到数组末尾。问要把第一个数组变为第二个数组至少需要多少次这样的操作请返回最小操作次数。1 n nums1.length 100000。nums2.length n 1。1 nums1[i], nums2[i] 100000。输入: nums1 [2,8], nums2 [1,7,3]。输出: 4。解释:步骤i操作nums1[i]更新后的 nums110追加-[2, 8, 2]20减少减少到 1[1, 8, 2]31减少减少到 7[1, 7, 2]42增加增加到 3[1, 7, 3]因此经过 4 次操作后nums1 转换为 nums2。题目来自力扣3724。核心解题思路分两大块我们要把 nums1 从长度 n 变成 n1所以必须且只需要执行 1 次「追加操作」。整个问题拆成 2 部分计算基础操作数把 nums1 前 n 个元素改成 nums2 前 n 个元素需要的加减次数。最优追加节省选择哪一个位置进行追加能让总操作数最少追加后新元素变成 nums2 最后一个元素的成本最低。以示例输入分步讲解输入nums1 [2, 8] n2nums2 [1, 7, 3] 长度 3 n1nums2 最后一个元素是3我们叫它 target。第一步计算「基础加减操作数」把 nums1 前 2 个元素改成 nums2 前 2 个元素nums1[0] 2 → nums2[0] 1减 1→ 1 次操作nums1[1] 8 → nums2[1] 7减 1→ 1 次操作✅基础总操作数 1 1 2第二步必须执行 1 次「追加操作」因为要把长度从 2 变 3必须追加 1 次这一步固定消耗✅追加操作数 1目前累计2 1 3 次。第三步处理追加后的新元素最关键追加的新元素最终要变成 nums2 最后一个数3。我们可以选择从 nums1 任意一个位置复制值进行追加不同选择成本不同我们遍历每一个位置计算**「从该位置复制追加 → 改成 target3」的最小成本**位置 0 分析原 nums1[0] 最终会改成 1复制追加的值 1要变成 3需要加 2→ 成本 2位置 1 分析原 nums1[1] 最终会改成 7复制追加的值 7要变成 3需要减 4→ 成本 4✅所有位置里最小的修改成本是 2选位置0追加第四步总最少操作数基础加减(2) 追加(1) 最小修改成本(2) 4和题目输出完全一致通用完整解题步骤所有输入都适用确定目标值取出 nums2 最后一个元素记为 target这是 nums1 追加后新元素必须变成的值。计算基础修改成本遍历 nums1 和 nums2 的前 n 个元素每个位置计算当前元素 → 目标元素需要加减多少次全部累加。这是把前 n 位对齐的固定成本。固定追加成本因为长度要从 n → n1必须追加 1 次成本 1。计算最优追加位置的最小成本遍历每一个下标 i该位置最终会被修改为 nums2[i]复制这个值追加到末尾计算这个复制值 → target 需要的加减次数记录所有位置里最小的那个成本。总和就是答案总操作数 基础修改成本 追加成本 最优追加修改成本时间复杂度 空间复杂度1. 时间复杂度我们只对数组做了一次从头到尾的遍历数组长度最大是 10⁵遍历中所有操作都是 O(1) 的简单计算✅时间复杂度O(n)n 是 nums1 的长度2. 额外空间复杂度只使用了几个变量存储基础成本、最小成本、目标值没有开辟任何与数组长度相关的额外空间✅额外空间复杂度O(1)常数级空间不随输入规模变大总结解题核心必须追加1次拆分「基础修改」「追加」「新元素修改」三部分最优解关键选复制后改成 target 成本最小的位置追加效率O(n) 时间 O(1) 额外空间完全适配题目 10万 数据规模。Go完整代码如下packagemainimport(fmtmath)funcminOperations(nums1,nums2[]int)int64{target:nums2[len(nums2)-1]ans:1// 把元素追加到 nums1 的末尾需要一次操作mn:math.MaxIntfori,x:rangenums1{y:nums2[i]ifxy{x,yy,x// 保证 x y简化后续逻辑}ansy-x// 如果 target 在 [x,y] 中那么在从 x 变成 y 的过程中可以顺带把 target 追加到 nums1 的末尾代价为 0// 如果 target x代价为 x-target// 如果 target y代价为 target-ymnmin(mn,max(x-target,target-y))}returnint64(ansmax(mn,0))// 如果 target 在 [x,y] 中上面可能会算出负数}funcmain(){nums1:[]int{2,8}nums2:[]int{1,7,3}result:minOperations(nums1,nums2)fmt.Println(result)}Python完整代码如下# -*-coding:utf-8-*-importmathdefminOperations(nums1,nums2):targetnums2[len(nums2)-1]ans1# 把元素追加到 nums1 的末尾需要一次操作mnmath.inffori,xinenumerate(nums1):ynums2[i]ifxy:x,yy,x# 保证 x y简化后续逻辑ansy-x# 如果 target 在 [x,y] 中那么在从 x 变成 y 的过程中可以顺带把 target 追加到 nums1 的末尾代价为 0# 如果 target x代价为 x-target# 如果 target y代价为 target-ymnmin(mn,max(x-target,target-y))returnansmax(mn,0)# 如果 target 在 [x,y] 中上面可能会算出负数# 测试nums1[2,8]nums2[1,7,3]resultminOperations(nums1,nums2)print(result)C完整代码如下#includeiostream#includevector#includealgorithm#includeclimitsusingnamespacestd;longlongminOperations(vectorintnums1,vectorintnums2){inttargetnums2[nums2.size()-1];longlongans1;// 把元素追加到 nums1 的末尾需要一次操作intmnINT_MAX;for(inti0;inums1.size();i){intxnums1[i];intynums2[i];if(xy){swap(x,y);// 保证 x y简化后续逻辑}ansy-x;// 如果 target 在 [x,y] 中那么在从 x 变成 y 的过程中可以顺带把 target 追加到 nums1 的末尾代价为 0// 如果 target x代价为 x-target// 如果 target y代价为 target-ymnmin(mn,max(x-target,target-y));}returnansmax(mn,0);// 如果 target 在 [x,y] 中上面可能会算出负数}intmain(){vectorintnums1{2,8};vectorintnums2{1,7,3};longlongresultminOperations(nums1,nums2);coutresultendl;return0;}
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2414760.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!