查找数组内和为 n 的两个数
代码实现
// 寻找和为 n 的两个数(嵌套循环) export function findTowNumbers1(arr: number[], n: number): number[] { const res: number[] = [] const length = arr.length if (length === 0) return res // O(n^2) for (let i = 0; i < length - 1; i++) { const n1 = arr[i] let flag = false // 是否得到了结果 for (let j = i + 1; j < length; j++) { const n2 = arr[j] if (n1 + n2 === n) { res.push(n1) res.push(n2) flag = true break } } if (flag) break } return res } // 查找和为 n 的两个数(双指针) export function findTowNumbers2(arr: number[], n: number): number[] { const res: number[] = [] const length = arr.length if (length === 0) return res let i = 0 // 头 let j = length - 1 // 尾 // O(n) while (i < j) { const n1 = arr[i] const n2 = arr[j] const sum = n1 + n2 if (sum > n) { // sum 大于 n ,则 j 要向前移动 j-- } else if (sum < n) { // sum 小于 n ,则 i 要向后移动 i++ } else { // 相等 res.push(n1) res.push(n2) break } } return res } // // 功能测试 const arr = [1, 2,1, 2,1, 2,1, 2,1, 2,1, 2,1, 2,1, 2,1, 2,1, 2,1, 2,1, 2,1, 2,1, 2, 4, 7, 11, 15] // console.info(findTowNumbers2(arr, 15)) console.time('findTowNumbers1') for (let i = 0; i < 100 * 10000; i++) { findTowNumbers1(arr, 15) } console.timeEnd('findTowNumbers1') // 730ms console.time('findTowNumbers2') for (let i = 0; i < 100 * 10000; i++) { findTowNumbers2(arr, 15) } console.timeEnd('findTowNumbers2') // 102
单测
import { findTowNumbers1, findTowNumbers2 } from '../07-找出数组中和为n的两个元素' describe('两数之和', () => { it('正常情况', () => { const arr = [1, 2, 4, 7, 11, 15] const res = findTowNumbers2(arr, 15) expect(res).toEqual([4, 11]) }) it('空数组', () => { const res = findTowNumbers2([], 100) expect(res).toEqual([]) }) it('找不到结果', () => { const arr = [1, 2, 4, 7, 11, 15] const n = 100 const res = findTowNumbers2(arr, n) expect(res).toEqual([]) }) })