前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >算法题之优势洗牌

算法题之优势洗牌

作者头像
挥刀北上
发布2019-07-19 15:13:18
4800
发布2019-07-19 15:13:18
举报
文章被收录于专栏:Node.js开发Node.js开发

今天解析一道名为优势洗牌的算法题目,这道题有点类似田忌赛马,来看看题目描述:

给定两个大小相等的数组 A 和 B,A 相对于 B 的优势可以用满足 A[i] > B[i] 的索引 i 的数目来描述。

返回 A 的任意排列,使其相对于 B 的优势最大化。

示例 1:

代码语言:javascript
复制
输入:A = [2,7,11,15], B = [1,10,4,11]
输出:[2,11,7,15]

示例2

代码语言:javascript
复制
输入:A = [12,24,8,32], B = [13,25,32,11]
输出:[24,32,8,12]

我们用示例2来说明,A、B两个数组长度一样,将A数组进行排列,让后逐项与B数组进行比较, A[i]>B[i]的一分,使分数最大化。

看起来很简单,但是该如何思考呢?从哪里下手呢?

我们可以先将A数组进行排序,从小到大进行排序,排序完成后,循环遍历B数组,用B数组中的每一项,去A数组中查找比这一项刚好大一点的数据,查找到后,将其放入到对应位置,如果查找不到从排序完成的A数组中抽出最小的放到当前位置。

计算流程图如下:我们以实例2为例进行分析。

第一步:

第二步: 遍历循环B数组中每一项,在排序完的A数组中找到比当前项大的数据。

第三步:

第四步:

第五步:

原理类似于田忌赛马,用A数组中的最小的数据,对冲B数组中的比较大的数据,剩下A数组中的数据挑选略大于B数组中的数据。代码如下:

代码语言:javascript
复制
function comp(arr1, arr2) {
  var arr = [];
  arr1.sort(function(a, b) {
    return a - b;
  });
  arr2.forEach(function(item) {
    var index = arr1.findIndex(function(_item) {
      return _item > item;
    });
    if (index > -1) {
      arr.push(arr1.splice(index, 1)[0]);
    } else {
      arr.push(arr1.splice(0, 1)[0]);
    }
  });
  return arr;
}

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2018-07-23,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 nodejs全栈开发 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档