JS实现查找数组差值最大两数索引的函数,要求大数在小数右侧
现有代码问题
- 对原数组直接调用
sort()会改变原数组顺序,且你拿到的索引是排序后数组的索引,不是原数组的真实索引,完全不符合需求 - JS默认
sort()是按字符串字典序排序,比如[10, 2]排序后会得到[10,2],数值排序逻辑本身就存在错误 - 没有考虑全局最小值在全局最大值右侧时,仍可能存在次小值在某个较大值左侧、差值为所有合法组合中最大的情况,比如测试用例
[13, 6, 3, 4, 10, 2, 3]中全局最小值2的索引是5,后面没有更大的值,但索引2的3后面存在索引4的10,差值7为最大合法差值,你的代码会直接返回空,逻辑完全错误 - 你写的函数调用传入了两个参数,但函数定义只接收一个参数,属于语法错误
正确实现思路
一次遍历数组即可完成计算:记录当前遍历到的最小值的索引,同时计算当前元素和当前最小值的差值,不断更新最大差值对应的两个索引即可,时间复杂度O(n),空间复杂度O(1)。
正确实现代码
function getProfit(arr) { // 数组长度不足2直接返回空 if (arr.length < 2) return [] let minIndex = 0 let maxDiff = 0 let result = [] for (let i = 1; i < arr.length; i++) { // 当前值更小,更新最小值索引 if (arr[i] < arr[minIndex]) { minIndex = i } else { const currentDiff = arr[i] - arr[minIndex] // 当前差值大于已记录的最大差值,更新结果 if (currentDiff > maxDiff) { maxDiff = currentDiff result = [minIndex, i] } } } // 没有合法正差值返回空,否则返回结果 return maxDiff > 0 ? result : [] } // 测试用例 console.log(getProfit([13, 6, 3, 4, 10, 2, 3])) // 输出 [2,4]
内容的提问来源于stack exchange,提问作者RuddaTriduba
相关产品推荐
相关产品推荐

