美文网首页
面试题:从有序数组中找到两个数最佳匹配和

面试题:从有序数组中找到两个数最佳匹配和

作者: 开心小蜗 | 来源:发表于2018-08-06 10:52 被阅读0次

试题:从类型为Array<Number>的有序数组中,找出两个数 xy,使得 xy 之和无限接近一个指定的数 n,实现函数 find(arr, n) ,返回找到的两个数 xy 并使其 x + y <= n

var arr = [-6.3, -4.33, -3.5, -1.5, 0.33, 5, 6.5, 8.2, 13.4]

var c = find(arr, 5)

if (c === -1) {
    console.log('不存在')
} else {
    console.log(c.join())
}

function find(arr, n) {
    var nIndex = binaryInsertion(arr, n)
    var inArr = false

    // 找到完全匹配项
    if (arr[nIndex] === n) {
        var zeroIndex = binaryInsertion(arr, 0)
        var zero = arr[zeroIndex]
        inArr = true

        if (!zero) {
            return n > 0 ? [0, arr[nIndex]] : [arr[nIndex], 0]
        }
    }

    // 最小项都大于n or 两最小值大于n
    if (nIndex === 0 && arr[0] + arr[1] > n) {
        return -1
    }

    // 最大两个数之和小于n
    if (nIndex === arr.length && arr[nIndex - 1] + arr[nIndex - 2] < n) {
        return [arr[nIndex - 2], arr[nIndex - 1]]
    }

    // 值一定是分布在两侧边的
    var x, y, sumX, sumY
    var sum = -99999999

    x = nIndex
    inArr && x--
    
    if (inArr && !x) return -1

    while (sum < n) {
        y = x + 1
        while (arr[x] + arr[y] <= n && arr[x] + arr[y] > sum) {
            sum = arr[x] + arr[y]
            sumX = x
            sumY = y
            y++
        }
        if (sum === n) {
            return [arr[x], arr[y - 1]]
        }
        if (x === 0) {
          break
        } else {
            x--
        }
    }

    return [arr[sumX], arr[sumY]]
}

function binaryInsertion(arr, find) {
  if (arr.length === 1) {
    return arr[0] < find ? 1 : 0
  }

  var mid = Math.floor(arr.length / 2)

  if (find < arr[mid]) {
    return binaryInsertion(arr.slice(0, mid), find)
  }
  return mid + binaryInsertion(arr.slice(mid), find)
}

相关文章

  • 面试题:从有序数组中找到两个数最佳匹配和

    试题:从类型为Array的有序数组中,找出两个数 x 和 y,使得 xy 之和无限接近一个指定的数...

  • 二分搜索

    需求: 从一个数组中找到某个数 原理: 1 在方法中,需要先对数组排序,排列成从大到小或从小到大的有序数组. ...

  • 每天一题LeetCode【第2天】

    T1. Two Sum 【Easy】 题目 给定一个数组和一个目标数,从数组中找到两个数,使得这两个数之和等于这个...

  • 查找

    查找 折半查找: 面试题: 给定一个有序的数组,如果往该数组中存储一个数,并保证这个数组还是有序的,那么这个元素的...

  • 面试题(数据结构)

    面试题(1).假设两个数组为A和B,A和B都是从小到大的顺序进行排列,生成一个有序的数组 解析:1.我们可以直接比...

  • 插入排序

    Introduce 思想 将数组看做两个数组,一个有序,一个无序,从索引为1的位置开始遍历,当前值和有序数组中的元...

  • Javascript Array

    数组常用方法 面试题 求两个数组的交集和差集 交集 差集

  • 有序数组合并

    1、两个有序数组合并(产生新数组) 2、两个有序数组合并(返回原来某个数组)

  • 4. 寻找两个有序数组的中位数

    分析 已知两个有序数组,找到两个数组合并后的中位数。 解法一 简单粗暴,先将两个数组合并,两个有序数组的合并也是归...

  • 在有序数组中找到某个数

    条件是数组中可能出现重复的数字,很容易就会想到折半查找,但是对于重复元素怎么处理? 解决方法一:最先想到的就是二分...

网友评论

      本文标题:面试题:从有序数组中找到两个数最佳匹配和

      本文链接:https://www.haomeiwen.com/subject/neewvftx.html