找出数组中和为n的两个数
题目:
- 有一个递增的数组[1,2,4,7,11,15]和 一个 n =15
- 数组中只有两个数和是n。即 4+11 === 15
- 写一个JS函数,找出这两个数
思路:
- 思路1: 嵌套循环,找到一个数,然后遍历下一个数,求和,判断。
- 时间复杂度:O(n^2),不可用
- 思路2: 双指针
- 定义 i 指向头,j 指向尾,求arr[i] + arr[j]
- 如果大于n, 则j向前移动;
- 如果小于n,则 i 向后移动
- 时间复杂度:O(n)
代码实现:
- 嵌套循环
function findTwoNumbers(arr: number[], n: number): number[]{ const length = arr.length; if(length === 0) return [] for(let i = 0; i< length-1; i++){ const n1 = arr[i] for(let j = i+ 1; j< length; j++){ const n2 = arr[j] if(n1 + n2 === n){ return [n1,n2] } } } return [] }
- 双指针
export function findTwoNumbers2(arr: number[], n: number) : number[]{ const length = arr.length; if(length === 0 ) return [] let i = 0; let j = length -1 while(i < j ){ const n1 = arr[i] const n2 = arr[j] const sum = n1 + n2 if(n < sum ){ j--; }else if(n > sum){ i++; }else{ return [n1,n2] } } return [] }
测试用例
/** * @description 寻找数组中 两数之后为 n 测试 * */ import {findTwoNumbers,findTwoNumbers2} from './two-numbers-sum' describe('寻找数组中 两数之后为 n 测试', ()=>{ it('正常数据测试',()=>{ const arr = [1,2,4,5,7,9,10] const n = 8 const res = findTwoNumbers(arr,n) const res2 = findTwoNumbers2(arr,n) expect(res).toEqual([1,7]) expect(res2).toEqual([1,7]) }) it('空数组',()=>{ const arr: number[] = [] const n = 8 const res = findTwoNumbers(arr,n) const res2 = findTwoNumbers2(arr,n) expect(res).toEqual([]) expect(res2).toEqual([]) }) it('未找到',()=>{ const arr = [1,2,4,5,7,9,10] const n = 80 const res = findTwoNumbers(arr,n) const res2 = findTwoNumbers2(arr,n) expect(res).toEqual([]) expect(res2).toEqual([]) }) })
两种方式性能对比:
//性能测试: let arr = [1,2,3,4,5,6,7,8,9,10] console.time('findTwoNumbers') for(let i = 0; i < 100 * 10000;i++){ findTwoNumbers(arr,15) } console.timeEnd('findTwoNumbers') console.time('findTwoNumbers2') for(let i = 0; i < 100 * 10000;i++){ findTwoNumbers2(arr,15) } console.timeEnd('findTwoNumbers2')
测试结果:
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 零经验选手,Compose 一天开发一款小游戏!
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!