如何固定首数组顺序,仅重排第二个数组以实现乘积总和最大化
实现方案
核心逻辑
基于排序不等式原理:两个序列同序相乘求和的结果最大,因此保持C数组位置不变的前提下,需要将C数组中数值越大的位置匹配越大的M数组元素。
实现步骤
- 为C数组每个元素绑定原始索引,避免排序后丢失元素的原有位置信息
- 将绑定索引的C数组按元素数值从大到小排序
- 将M数组复制后按数值从大到小排序,避免修改原M数组
- 新建结果数组,遍历排序后的C和M,将排序后的M元素依次放入对应C元素的原始索引位置
- 最终返回重排后的M数组
代码实现
function getMaxSumMultiplierArr(C, M) { // 绑定C元素的原始索引 const indexedC = C.map((value, index) => ({ value, index })); // C按数值降序排序 indexedC.sort((a, b) => b.value - a.value); // M复制后按数值降序排序 const sortedM = [...M].sort((a, b) => b - a); const rearrangedM = new Array(M.length); // 对应位置赋值 for (let i = 0; i < indexedC.length; i++) { rearrangedM[indexedC[i].index] = sortedM[i]; } return rearrangedM; }
测试验证
// 示例1测试 const C1 = [10, 5, 6, 7]; const M1 = [8, 9, 2, 5]; console.log(getMaxSumMultiplierArr(C1, M1)); // 输出:[9, 2, 5, 8] // 示例2测试 const C2 = [5, 3, 7, 1]; const M2 = [1, 4, 3, 9]; console.log(getMaxSumMultiplierArr(C2, M2)); // 输出:[4, 3, 9, 1]
内容的提问来源于stack exchange,提问作者Diego Villafañe
相关产品推荐
相关产品推荐

