资讯详情

DeepSeek LeetCode 462. 最小操作次数使数组元素相等 II Java实现

📅 2026/10/31 2:05:55 | 华诺云谱 👁 阅读
DeepSeek    LeetCode 462. 最小操作次数使数组元素相等 II Java实现
LeetCode 462. 最小操作次数使数组元素相等 II题目思路每次操作可让某个元素 1 或 -1要让所有元素相等且操作次数最少。数学结论设目标值为 x总代价为f(x) Σ |nums[i] - x|这是关于 x 的凸函数最小值在数组的中位数处取得偶数长度时取中间两个之一都行结果相同。直观理解把数组排序后把两端元素向中间靠拢。每次同时移动一对 (nums[left], nums[right])让它们相遇的最优位置就是中位数——移动 nums[right] - nums[left] 次。所有配对代价之和恰好等于每个元素到中位数的距离之和。解法一排序取中位数推荐importjava.util.Arrays;classSolution{publicintminMoves2(int[]nums){Arrays.sort(nums);intmediannums[nums.length/2];intmoves0;for(intnum:nums){movesMath.abs(num-median);}returnmoves;}}解法二快速选择找中位数O(n) 平均importjava.util.concurrent.ThreadLocalRandom;classSolution{publicintminMoves2(int[]nums){intnnums.length;intmedianquickSelect(nums,0,n-1,n/2);intmoves0;for(intnum:nums){movesMath.abs(num-median);}returnmoves;}// 返回第 k 小元素0-indexedprivateintquickSelect(int[]nums,intleft,intright,intk){while(leftright){intpivotIdxleftThreadLocalRandom.current().nextInt(right-left1);// 把 pivot 换到 left 位置swap(nums,left,pivotIdx);intpivotnums[left];intileft,jright;// 双指针分区避免大量重复元素退化while(ij){while(ijnums[j]pivot)j--;nums[i]nums[j];while(ijnums[i]pivot)i;nums[j]nums[i];}nums[i]pivot;if(ik)returnnums[i];elseif(ik)lefti1;elserighti-1;}returnnums[left];}privatevoidswap(int[]nums,inti,intj){inttmpnums[i];nums[i]nums[j];nums[j]tmp;}}复杂度分析解法 时间复杂度 空间复杂度 适用场景排序取中位数 O(n log n) O(log n)排序栈空间 代码简洁实际足够快快速选择 平均 O(n)最坏 O(n²) O(1) 数据量大且追求线性时间示例验证示例 1nums [1,2,3]· 排序后中位数 2· 代价|1-2| |2-2| |3-2| 1 0 1 2 ✓示例 2nums [1,10,2,9]· 排序后 [1,2,9,10]中位数取 2 或 9 均可· 取 21 0 7 8 16取 98 7 0 1 16 ✓两者结果相同易混淆题对比题目 操作方式 结论462本题 可 1 或 -1 选中位数代价为距离和453. 最小操作次数使数组元素相等 只能 1一次加 n-1 个元素 选最小值代价为 Σ(nums[i] - min)注意 453 题的等价转化每次给 n-1 个元素 1等价于每次给 1 个元素 -1因此目标是让所有元素降到最小值。而本题允许双向操作因此取中位数最优。
📝

华诺云谱内容团队

资深建站顾问 · 行业研究员

10年+企业数字化服务经验,专注智能建站、SEO优化与品牌营销,持续输出建站技巧、行业洞察与营销干货,已帮助5000+企业实现数字化增长。

你可能需要的服务

订阅华诺云谱资讯周报

每周一封,精选建站技巧、SEO与营销干货,直达邮箱。已有 8,000+ 企业主订阅,助你少走弯路。

↑