给定一个整数数组和一个整数目标值,在数组中找出两个数,使得它们的和等于目标值,返回这两个数的索引。示例输入:nums = [2,7,11,15], target = 9,输出【0,1】

技术:javascript

此题为Leetcode上的题目,本文采用简单二叉树深度遍历的方式实现。在数据量庞大的情况下,可以将简单二叉树进一步优化成平衡二叉树。

function Node(value, index) {
    this.left = null
    this.right = null
    this.value = value
    this.index = index
}
// 创建链表
function createLinkedList(arr) {
    if (arr.length === 0) return null
    var root = new Node(arr[0], 0)
    var node = root
    for (let i = 1; i <= arr.length; i++) {
        if (i === arr.length) {
            node.next = null
        } else {
            node.next = new Node(arr[i], i)
            node = node.next
        }
    }
    return root
}
function addNode(root, nextValue, index) {
    if (root === null) return null
    if (root.value <= nextValue) {
        if (root.right === null) root.right = new Node(nextValue, index)
        else addNode(root.right, nextValue, index)
    } else {
        if (root.left === null) root.left = new Node(nextValue, index)
        else addNode(root.left, nextValue, index)
    }
}

// 构建二叉搜索树
function createTree(arr) {
    if (arr === null || arr.length === 0) return null
    var root = new Node(arr[0], 0)
    for (let i = 1; i < arr.length; i++) {
        addNode(root, arr[i], i)
    }
    return root
}


function deepSearch(root, differenceVal, fistNode) {
    if (root === null) return false
    if (root.value === differenceVal && root.index !== fistNode.index) return root
    if (root.value > differenceVal) {
        return deepSearch(root.left, differenceVal, fistNode)
    } else {
        return deepSearch(root.right, differenceVal, fistNode)
    }
}
function goThrough(link, tree, sum) {
    if (link === null) return false
    var differenceVal = sum - link.value // 深度搜索查找差值
    if (!deepSearch(tree, differenceVal, link)) {  // 第三个参数可以直接使用link.index作为入参
        return goThrough(link.next, tree, sum)
    } else return {
        firstIndex: link.index,
        secondIndex: deepSearch(tree, differenceVal, link).index
    }
}

function twoSum(arr, sum) {
    var tree = createTree(arr)
    var link = createLinkedList(arr)
    let result = goThrough(link, tree, sum)
    console.log('result', result);

}
console.time()
let arr = [44, 6, 22, 56, 12, 3, 5, 3, 300, 100, 56, 12, 3, 5, 3, 300, 100]
console.log(arr.length);
twoSum(arr, 400)
console.timeEnd();

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值