zoukankan      html  css  js  c++  java
  • Combination Sum IV -- LeetCode

    Given an integer array with all positive numbers and no duplicates, find the number of possible combinations that add up to a positive integer target.

    Example:

    nums = [1, 2, 3]
    target = 4
    
    The possible combination ways are:
    (1, 1, 1, 1)
    (1, 1, 2)
    (1, 2, 1)
    (1, 3)
    (2, 1, 1)
    (2, 2)
    (3, 1)
    
    Note that different sequences are counted as different combinations.
    
    Therefore the output is 7.

    Follow up:
    What if negative numbers are allowed in the given array?
    How does it change the problem?
    What limitation we need to add to the question to allow negative numbers?

    思路:递归求解。

    为了避免相同的解重复计数,要将原数组中的重复数字剔除,这样子所有的情况都只会枚举一遍。

    同时,为了提速,在递归过程中,可以用一个map记录子问题的结果,这样就可以节省时间。

    补充:如果数组中有负数,则应该添加的额外条件是最多可以有几个数相加。

     1 class Solution {
     2 public:
     3     int help(vector<int>& nums, int target, unordered_map<int, int>& solutionCount) {
     4         int count = 0;
     5         for (int i = 0; i < nums.size() && nums[i] <= target; i++) {
     6             if (nums[i] < target) {
     7                 int balance = target - nums[i];
     8                 if (solutionCount.count(balance))
     9                     count += solutionCount[balance];
    10                 else {
    11                     int subCount = help(nums, balance, solutionCount);
    12                     solutionCount.insert(make_pair(balance, subCount));
    13                     count += subCount;
    14                 }
    15             }
    16             else count++;
    17         }
    18         return count;
    19     }
    20     int combinationSum4(vector<int>& nums, int target) {
    21         if (nums.size() == 0) return 0;
    22         sort(nums.begin(), nums.end(), less<int>());
    23         vector<int> distinctNum(1, nums[0]);
    24         unordered_map<int, int> solutionCount;
    25         for (int i = 1; i < nums.size(); i++)
    26             if (nums[i] != nums[i-1]) distinctNum.push_back(nums[i]);
    27         return help(distinctNum, target, solutionCount);
    28     }
    29 };

     

  • 相关阅读:
    Selenium 项目搭建过程
    Selenium Javascript 滚动条操作
    Selenium KPI接口 时间等待
    Selenium KPI接口 附件上传
    Selenium KPI接口 警告弹 -alert/confirm/promp
    Selenium KPI接口 窗口句柄
    Selenium KPI接口 iframe切换
    Selenium KPI接口 屏幕截图
    Linux文件权限管理
    Linux中的各种文件类型
  • 原文地址:https://www.cnblogs.com/fenshen371/p/5814283.html
Copyright © 2011-2022 走看看