找出数组中和为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')
复制代码

测试结果:

 

posted @   yangkangkang  阅读(3)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 零经验选手,Compose 一天开发一款小游戏!
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!
点击右上角即可分享
微信分享提示