• 1655. Distribute Repeating Integers


    问题:

    给定一组数,将其分配给多个用户,

    每个用户要求quantity[i]个相同的数。

    问是否能够分配完。

    Example 1:
    Input: nums = [1,2,3,4], quantity = [2]
    Output: false
    Explanation: The 0th customer cannot be given two different integers.
    
    Example 2:
    Input: nums = [1,2,3,3], quantity = [2]
    Output: true
    Explanation: The 0th customer is given [3,3]. The integers [1,2] are not used.
    
    Example 3:
    Input: nums = [1,1,2,2], quantity = [2,2]
    Output: true
    Explanation: The 0th customer is given [1,1], and the 1st customer is given [2,2].
    
    Example 4:
    Input: nums = [1,1,2,3], quantity = [2,2]
    Output: false
    Explanation: Although the 0th customer could be given [1,1], the 1st customer cannot be satisfied.
    
    Example 5:
    Input: nums = [1,1,1,1,1], quantity = [2,3]
    Output: true
    Explanation: The 0th customer is given [1,1], and the 1st customer is given [1,1,1].
     
    Constraints:
    n == nums.length
    1 <= n <= 105
    1 <= nums[i] <= 1000
    m == quantity.length
    1 <= m <= 10
    1 <= quantity[i] <= 105
    There are at most 50 unique values in nums.
    

      

    解法:Backtracking(回溯算法)

    状态:第pos个用户,被分配的数字。

    选择:数字中个数>=该pos用户要求的个数,的所有数字选择。

    递归退出条件:pos==用户数quantity.size

    ⚠️ 注意:简单的回溯,会导致超时。

    因此将用户要求按数字多的->少的进行DESC降序排序,首先满足要求多的。

    代码参考:

     1 class Solution {
     2 public:
     3    // int count = 0;
     4    // void print_intend() {
     5    //     for(int i=0; i<count; i++)
     6    //         printf("  ");
     7    // }
     8     void backtrack(bool& res, int pos, vector<int>& quantity, vector<int>& nc) {
     9         if(pos==quantity.size()) {
    10     //        print_intend();
    11     //        printf("return true
    ");
    12             res = true;
    13             return;
    14         }
    15        // int idx = lower_bound(nc.begin(), nc.end(), quantity[pos])-nc.begin();
    16        // print_intend();
    17        // printf("lower_bound idx:[%d]
    ",idx);
    18         //for(int i=idx; i<nc.size(); i++) {
    19         for(int i=0; i<nc.size(); i++) {
    20             if(nc[i]<quantity[pos]) continue;
    21             nc[i]-=quantity[pos];
    22       //      count++;
    23       //      print_intend();
    24       //      printf("pos:%d, idx:%d, nc[998]:%d ,nc[999]:%d
    ", pos, i, nc[998], nc[999]);
    25             backtrack(res, pos+1, quantity, nc);
    26       //      count--;
    27             nc[i]+=quantity[pos];
    28             if(res==true) return;
    29         }
    30         //print_intend();
    31         //printf("return [try all finished]
    ");
    32         return;
    33     }
    34     bool canDistribute(vector<int>& nums, vector<int>& quantity) {
    35         bool res = false;
    36         vector<int> nc;
    37         unordered_map<int, int> ncount;
    38         for(int n:nums) {
    39             ncount[n]++; // count
    40         }
    41         for(auto nct:ncount) {
    42             nc.push_back(nct.second);
    43         }
    44         sort(quantity.rbegin(), quantity.rend());
    45         backtrack(res, 0, quantity, nc);
    46         return res;
    47     }
    48 };
  • 相关阅读:
    如何创建多线程
    Oracle导入数据表
    Oracle如何创建数据库用户
    Oracle忘记密码,如何修改密码
    Oracle如何创建表空间
    leetcode 787. K 站中转内最便宜的航班 js题解
    JS实现平衡二叉树
    typescript的安装与配置
    二分查找JS实现
    JS作用域(一):一般变量声明
  • 原文地址:https://www.cnblogs.com/habibah-chang/p/14401961.html
Copyright © 2020-2023  润新知