function searchNum1 (arr:number[],n:number):number[] {
const len = arr.length
if (len < 2) return [];
const res:number[] = []
for (let i = 0; i < len; i++) {
let flag = false // 判断是否找到了结果
for (let j = i + 1; j < len; j++) {
let sum = arr[i] + arr[j]
if (sum === n ) {
flag = true
res.push(arr[i])
res.push(arr[j])
break;
}
}
if (flag) break;
}
return res
}
const arr = [1,2,4,7,11,15]
console.log(searchNum1(arr,15)) // [4, 11]
describe('查找两数之和',() => {
it('正常情况', () => {
const arr = [1,2,4,7,11,15]
const res = searchNum1(arr,15)
expect(res).toEqual([4,11])
})
it('空数组', () => {
const res = searchNum1([],15)
expect(res).toEqual([])
})
it('找不到值的情况', () => {
const arr = [1,2,4,7,11,15]
const res = searchNum1(arr,100)
expect(res).toEqual([])
})
})
function searchNum2 (arr:number[],n:number):number[] {
const len:number = arr.length
if (len < 2) return []
const res:number[] = []
let i = 0 // head
let j = len -1 // tail
while(i < j) {
let sum = arr[i] + arr[j]
if (sum > n) {
// 和大于n,则向前找,尾部下标-1
j--;
} else if (sum < n) {
// 和小于n,则向后找,头部+1
i++;
} else {
// 相等
res.push(arr[i])
res.push(arr[j])
break;
}
}
return res
}
const arr = [1,2,4,7,11,15,18,19,20]
console.log(searchNum2(arr,15)) // [4,11]
describe('查找两数之和',() => {
it('正常情况', () => {
const arr = [1,2,4,7,11,15]
const res = searchNum2(arr,15)
expect(res).toEqual([4,11])
})
it('空数组', () => {
const res = searchNum2([],15)
expect(res).toEqual([])
})
it('找不到值的情况', () => {
const arr = [1,2,4,7,11,15]
const res = searchNum2(arr,100)
expect(res).toEqual([])
})
})
const arr = [1,2,1,2,1,2,1,2,1,2,1,2,4,7,11,15,18,19,20]
console.time('searchNum1')
for (let i = 0; i < 100 * 10000; i++) {
searchNum1(arr,15)
}
console.timeEnd('searchNum1')
console.time('searchNum2')
for (let i = 0; i < 100 * 10000; i++) {
searchNum2(arr,15)
}
console.timeEnd('searchNum2')
打印结果:
searchNum1: 133.034ms
searchNum2: 38.977ms
时间复杂度:嵌套循环O(n^2) ,双指针O(n)
综上所述,双指针用于解决此题更优