美文网首页
面试题:合并两个有序数组为一个有序数组

面试题:合并两个有序数组为一个有序数组

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

试题:给定两个有序数组 [1, 2, 4, 9, 10, 15, 33][3, 5, 8, 9, 13],合并为一个有序数组

思路一:

var a = [1, 2, 4, 9, 10, 15, 33]
var b = [3, 5, 8, 9, 13]

merge(a, b)

function merge(a, b) {
    var ret = []

    if (a[0] > b[0]) {
        ret = ret.concat(find(a, b))
    } else {
        ret = ret.concat(find(b, a))
    }

    return ret
}

// 假设 a[0] > b[0]
function find(a, b) {
    var ret = []
    var ia = 0
    var ib = 0

    // 探寻本次ib End
    while (a[ia] >= b[ib]) {
        ib++
    }

    // 探寻本次ia End
    ia++
    while (a[ia] >= b[ib - 1] && a[ia] < b[ib]) {
        ia++
    }

    ret = ret.concat(b.slice(0, ib), a.slice(0, ia))

    if (ia === a.length) {
        return ret.concat(b.slice(ib, b.length))
    } else if (ib === b.length) {
        return ret.concat(a.slice(ia, a.length))
    } else {
        return ret.concat(merge(a.slice(ia), b.slice(ib)))
    }
}

思路二:

var a = [1, 2, 4, 9, 10, 15, 33]
var b = [3, 5, 8, 9, 13]

var c = merge(a, b)
console.log(c.join())

// 假设 a[0] < b[0]
function merge(a, b) {
  var splitPoint = []
  var ret = []
  var i = 0
  var splitIndex = 0
  var len, x, y, splitNumber, start, end

  if (a[0] < b[0]) {
    x = a
    y = b
  } else {
    x = b
    y = a
  }

  splitNumber = y[0]
  while (splitIndex !== x.length && splitIndex !== y.length) {
    if (i++ % 2) {
      splitIndex = binaryInsertion(y, splitNumber)
      splitNumber = y[splitIndex]
    } else {
      splitIndex = binaryInsertion(x, splitNumber)
      splitNumber = x[splitIndex]
    }
    splitPoint.push(splitIndex)
  }

  if (splitIndex === x.length) {
    splitPoint.push(x.length, y.length)
  } else if (splitIndex === y.length) {
    splitPoint.push(y.length, x.length)
  }

  splitPoint.unshift(0, 0)
  for (i = 2, len = splitPoint.length; i < len; i++) {
    start = splitPoint[i - 2]
    end = splitPoint[i]
    if (i % 2) {
      ret = ret.concat(y.slice(start, end))
    } else {
      ret = ret.concat(x.slice(start, end))
    }
  }
  return ret
}

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)
}

相关文章

  • 数据结构-Java 02.习题汇总1

    1. 合并两个有序的数组 给出两个有序的整数数组A和B,请将数组B合并到数组A中,变成一个有序的数组。注意:可以假...

  • 有序数组合并

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

  • 合并两个有序数组(C)

    合并两个有序数组,合并完之后仍有序:

  • 归并排序

    一.两个有序数组的排顺 如果有两个有序的数组合并为一个有序数组,我们可以用下面的代码实现: 其中数组a,b为我们已...

  • LeetCode-88-合并两个有序数组

    LeetCode-88-合并两个有序数组 88. 合并两个有序数组[https://leetcode-cn.com...

  • LeetCode--两个有序数组合并

    题目: 如何将两个有序数组合并成一个有序数组 思路: 1:首先初始化 辅助数组,该数组存储的是两个有序数组的所有数...

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

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

  • 算法 -- 归并排序 - 草稿

    merge 归并排序原理 归并排序 == 递归 + 合并 合并 将两个有序的数组合并成一个有序的大数组;(从两个小...

  • 高效的合并两个有序数组

    前言:前几天面试遇到了一个面试题,如何高效的合并两个有序数组,这两个有序数组没有相同的元素,想了想,当时写的逻辑稍...

  • js 合并两个有序数组 成一个有序数组

    将两个有序数组合并成一个有序数组,假设两个数组,a和b合并成c. 我的想法是,以b数组作为参照,从下标0 开始 逐...

网友评论

      本文标题:面试题:合并两个有序数组为一个有序数组

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