算法题记录【华为od】MVP争夺战

题目描述

思路分析

         有俩种思路,

        一个是先求出符合要求的mvp得分,之后再用递归求出满足要求的球员数量,

        另一个我认为可以遍历得分数,然后按照得分数去遍历球员列表,求出满足要求的球员

代码解析

let input = "3 3 2 3 3 1 3 1 1 1 1 1 1"
let input1 = 9, sum = 0, res = [], result = [], fially = []
//填充数组 题目规定数组最大长度为50
let cachesList = new Array(50).fill(0)
let array = input.split(" ")
let len = array.length;
func(array, len)
function func (array, len) {
  array.map(item => sum += parseInt(item))
  //i 为得分人数
  for (let i = len; i >= 2; i--) {
    //只判断可以整除的数字
    if (sum % i != 0) continue;
    //判断当前得分是否可以满足要求
    if (share(array, len, i, sum / i, cachesList, sum / i, 1)) {
      let a = [], sums = 0;
      //整合全部结果进行筛选 偷懒做法 因为result已经将符合sum / i的值放到一起
      //所以可以直接按顺序输出和为sum / i的值放到一起
      //实在看不懂文字 把俩console.log()注释消掉就可以知道了
      // console.log('result=>', result);
      for (let j = 0; j < result.length + 1; j++) {
        if (sums < (sum / i)) {
          sums += parseInt(result[j])
          a.push(result[j])
        } else {
          res.push(a)
          a = []
          sums = 0
          sums += parseInt(result[j])
          a.push(result[j])
        }
      }
      //res为最终输出结果
      // console.log('res=>', res);
    }
  }
}
//array 原定数组
//len 原定数组长度
//target 原定分组后目标长度
//groupSum 分组目标值 
//cachesList 选定数组缓存下标
//goal 当前需要获得的目标值
//groupId 当前已经获得的目标长度
function share (array, len, target, groupSum, cachesList, goal, groupId) {
  if (goal < 0) return false;
  //筛选已满足要求的数组
  if (goal == 0) {
    groupId++;
    //重新赋值
    goal = groupSum;
    //原定分组后目标长度 == 当前已经获得的目标长度 输出结果
    if (groupId == target + 1) return true;
  }
  for (let i = 0; i < len; i++) {
    //筛选未选定数组缓存下标
    if (cachesList[i] != 0) continue;
    cachesList[i] = groupId + 1;
    //利用数组特质 满足要求加入数组 未满足要求则从数组中输出
    result.push(array[i])
    //递归 是否有满足当前目标值的选项 cachesList用于存储已经获取的数组(用于表述球员数量)
    if (share(array, len, target, groupSum, cachesList, goal - array[i], groupId)) return true;
    result.pop()
    //恢复缓存数组
    cachesList[i] = 0
  }
}

后话

只是记录,正在找工作中,各位老板缺前端的可以私信,会vue,react,ts,js,22届本科毕业,一年工作经验

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值