分配重复整数

07/17/2021

leetcode-分配重复整数

题目描述

给你一个长度为 n 的整数数组 nums ,这个数组中至多有 50 个不同的值。同时你有 m 个顾客的订单 quantity ,其中,整数 quantity[i] 是第 i 位顾客订单的数目。请你判断是否能将 nums 中的整数分配给这些顾客,且满足:

第 i 位顾客 恰好 有 quantity[i] 个整数。
第 i 位顾客拿到的整数都是 相同的 。
每位顾客都满足上述两个要求。
如果你可以分配 nums 中的整数满足上面的要求,那么请返回 true ,否则返回 false 。

示例 1:

输入:nums = [1,2,3,4], quantity = [2]
输出:false
解释:第 0 位顾客没办法得到两个相同的整数。
示例 2:

输入:nums = [1,2,3,3], quantity = [2]
输出:true
解释:第 0 位顾客得到 [3,3] 。整数 [1,2] 都没有被使用。
示例 3:

输入:nums = [1,1,2,2], quantity = [2,2]
输出:true
解释:第 0 位顾客得到 [1,1] ,第 1 位顾客得到 [2,2] 。

提示:

  • n == nums.length
  • 1 <= n <= 105
  • 1 <= nums[i] <= 1000
  • m == quantity.length
  • 1 <= m <= 10
  • 1 <= quantity[i] <= 105
  • nums 中至多有 50 个不同的数字。

本人题解

/**
 * @param {number[]} nums
 * @param {number[]} quantity
 * @return {boolean}
 */
var canDistribute = function(nums, quantity) {
  let numO = {}, numsA = [];
  nums.forEach(n => numO[n] = numO[n] ? numO[n] + 1 : 1);
  numsA = Object.keys(numO).map(i => numO[i]).sort((a,b) => b-a)
  quantity.sort((a,b) => b-a)
  let result = false
  function distribute(nums, _quantity) {
    if (_quantity.length == 0) {
      result = true
    }
    if (result) return;
    let q = _quantity.shift();
    nums.forEach((n, i) => {
      if (n >= q) {
        let ns = [...nums]
        ns[i] = n - q
        distribute(ns, [..._quantity])
      }
    })
  }
  distribute([...numsA], [...quantity])
  return result
};

分析

忘了。以后再补