怎样写出高效率的JS
假设:要在一个数字数组中找出每两个数和为10的元素生成新的数组
例如:[1,2,3,4,5,6,7,8,9] => [[1,9], [2,8]...]
版本1
let arr = [1, 2, 3, 4, 5, 6, 7, 8, 9, -1, 10, 11, 0]
function findSumIsTen(arr) {
let temp = []
for(let i = 0; i < arr.length; i++) {
for(let j = i + 1; j < arr.length; j++) {
if(arr[i] + arr[j] === 10){
temp.push([arr[i], arr[j]])
}
}
}
return temp
}
console.log(findSumIsTen())
这个版本利用了两层循环,思路简单,容易实现,但是效率不高,时间复杂度达到了
数据量大的情况下当然就不适合
版本2
我们知道对于一个有序的序列,操作起来更加高效,因此我们可以先对数组进行排序,排序算法当然要选好,那样的时间复杂度可以降到对数级
let arr = [11, 2, 5, 0, 9, 8, -10, 1, 6, 5, 7, 4, 3]
function map(arr) {
let temp = []
arr.sort((a, b) => a - b)
for(let i = 0, j = arr.length - 1; j > i;) {
let sum = arr[i] + arr[j]
if(sum > 10) {
j--
} else if(sum < 10) {
i++
} else {
temp.push([arr[i], arr[j]])
i++
j--
}
}
return temp
}
console.log(map(arr))
版本三的时间复杂度直接降到了O(n)大大提高了执行效率