算法题:两个有序数组合并(最优解)

合并两个有序数组最优解:
时间复杂度:O(n)
空间复杂度:O(n)

// 正向
var mergeSortedArray = function(arr1, arr2) {
  let m = 0;
  let n = 0;
  let news = [];
  let len = arr1.length + arr2.length - 1;
  let o = 0;
  while(o < len) {
    news[o++] = arr1[m] < arr2[n] ? arr1[m++] : arr2[n++];
  }
  while(m < arr1.length) {
    news.push(arr1[m++])
  }
  while(n < arr2.length) {
    news.push(arr2[n++])
  }
  return news
}

let arr = mergeSortedArray([2,3,5,6,9], [1,2,3,29]); // [1, 2, 2, 3, 3, 5, 6, 9, 29]

console.log(arr)

// 反向
var mergeSortedArray = function(arr1, arr2) {
  let m = arr1.length - 1;
  let n = arr2.length - 1;
  let news = [];
  let o = m + n + 1;
  while(o >= 0) {
    news[o--] = arr1[m] > arr2[n] ? arr1[m--] : arr2[n--];
  }
  
  return news
}

let arr = mergeSortedArray([2,3,5,6,9], [1,2,3,29]); // [1, 2, 2, 3, 5, 6, 9, 29]

console.log(arr)

接下来难度升级:
合并两个有序数据后再去重

时间复杂度:O(n)
空间复杂度:O(n)

// 反向
var mergeSortedArrayAndUnique = function(arr1, arr2) {
  let m = arr1.length - 1;
  let n = arr2.length - 1;
  let news = [];
  let o = m + n + 1;// 合并后的数组最大长度为arr1和arr2长度的和
  while(o >= 0) {
  	// 过滤掉news中已经存在的值
    if(arr1[m] == news[0]) {
      m--;
      o--;
      continue;
    }
    if(arr2[n] == news[0]) {
      n--;
      o--;
      continue;
    }
    if(arr1[m] > arr2[n]) {
      news.unshift(arr1[m--]);
    } else if (arr1[m] == arr2[n]) {
      news.unshift(arr1[m]);
      m--;
      n--;
      o--;
    } else {
      news.unshift(arr2[n--]);
    }
    o--;
  }
  
  return news
}

let arr = mergeSortedArrayAndUnique([2,2,3,5,6,9], [1,2,3,29]); 
// [1, 2, 3, 5, 6, 9, 29]
console.log(arr);

最后,如果感兴趣的同学,可以试着写写合并两个有序数据后再去重的正向解题。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值