Numbers can be regarded as product of its factors. For example,

8 = 2 x 2 x 2;
= 2 x 4.

Write a function that takes an integer n and return all possible combinations of its factors.

Note:

  1. You may assume that n is always positive.
  2. Factors should be greater than 1 and less than n.

Example 1:

Input: 1
Output: []

Example 2:

Input: 37
Output:[]

Example 3:

Input: 12
Output:
[
[2, 6],
[2, 2, 3],
[3, 4]
]

Example 4:

Input: 32
Output:
[
[2, 16],
[2, 2, 8],
[2, 2, 2, 4],
[2, 2, 2, 2, 2],
[2, 4, 4],
[4, 8]
]

这道题给了我们一个正整数n,让写出所有的因子相乘的形式,而且规定了因子从小到大的顺序排列,那么对于这种需要列出所有的情况的题目,通常都是用回溯法来求解的,由于题目中说明了1和n本身不能算其因子,那么可以从2开始遍历到n,如果当前的数i可以被n整除,说明i是n的一个因子,将其存入一位数组 out 中,然后递归调用 n/i,此时不从2开始遍历,而是从i遍历到 n/i,停止的条件是当n等于1时,如果此时 out 中有因子,将这个组合存入结果 res 中,参见代码如下:

解法一:

class Solution {
public:
vector<vector<int>> getFactors(int n) {
vector<vector<int>> res;
helper(n, , {}, res);
return res;
}
void helper(int n, int start, vector<int> out, vector<vector<int>>& res) {
if (n == ) {
if (out.size() > ) res.push_back(out);
return;
}
for (int i = start; i <= n; ++i) {
if (n % i != ) continue;
out.push_back(i);
helper(n / i, i, out, res);
out.pop_back();
}
}
};

下面这种方法用了个小 trick,我们仔细观察题目中给的两个例子的结果,可以发现每个组合的第一个数字都没有超过n的平方根,这个也很好理解,由于要求序列是从小到大排列的,那么如果第一个数字大于了n的平方根,而且n本身又不算因子,那么后面那个因子也必然要与n的平方根,这样乘起来就必然会超过n,所以不会出现这种情况。那么刚开始在2到n的平方根之间进行遍历,如果遇到因子,先复制原来的一位数组 out 为一个新的一位数组 new_out,然后把此因子i加入 new_out,然后再递归调用 n/i,并且从i遍历到 n/i 的平方根,之后再把 n/i 放入 new_out,并且存入结果 res,由于层层迭代的调用,凡是本身能继续拆分成更小因数的都能在之后的迭代中拆分出来,并且加上之前结果,最终都会存 res 中,参见代码如下:

解法二:

class Solution {
public:
vector<vector<int>> getFactors(int n) {
vector<vector<int>> res;
helper(n, , {}, res);
return res;
}
void helper(int n, int start, vector<int> out, vector<vector<int>> &res) {
for (int i = start; i <= sqrt(n); ++i) {
if (n % i != ) continue;
vector<int> new_out = out;
new_out.push_back(i);
helper(n / i, i, new_out, res);
new_out.push_back(n / i);
res.push_back(new_out);
}
}
};

上面两种解法虽有些小不同,但是构成结果的顺序都是相同,对于题目中给的两个例子 n = 12 和 n = 32,结果如下:

n = 

n = 

上面两种方法得到的结果跟题目中给的答案的顺序不同,虽然顺序不同,但是并不影响其通过 OJ。下面就给出生成题目中的顺序的解法,这种方法也不难理解,还是从2遍历到n的平方根,如果i是因子,那么递归调用n/i,结果用v来保存,然后新建一个包含i和 n/i 两个因子的序列 out,然后将其存入结果 res, 然后再遍历之前递归 n/i 的所得到的序列,如果i小于等于某个序列的第一个数字,那么将其插入该序列的首位置,然后将序列存入结果 res 中,举个例子,比 n = 12,那么刚开始 i = 2,是因子,然后对6调用递归,得到 {2, 3},然后此时将 {2, 6} 先存入结果中,然后发现i(此时为2)小于等于 {2, 3} 中的第一个数字2,那么将2插入首位置得到 {2, 2, 3} 加入结果,然后此时i变成3,还是因子,对4调用递归,得到 {2, 2},此时先把 {3, 4} 存入结果,然后发现i(此时为3)大于 {2, 2} 中的第一个数字2,不做任何处理直接返回,这样就得到正确的结果了:

解法三:

class Solution {
public:
vector<vector<int>> getFactors(int n) {
vector<vector<int>> res;
for (int i = ; i * i <= n; ++i) {
if (n % i != ) continue;
vector<vector<int>> v = getFactors(n / i);
vector<int> out{i, n / i};
res.push_back(out);
for (auto a : v) {
if (i <= a[]) {
a.insert(a.begin(), i);
res.push_back(a);
}
}
}
return res;
}
};

这种方法对于对于题目中给的两个例子 n = 12 和 n = 32,结果和题目中给的相同:

n = 

n = 

Github 同步地址:

https://github.com/grandyang/leetcode/issues/254

类似题目:

Combination Sum III

Combination Sum II

Combination Sum

参考资料:

https://leetcode.com/problems/factor-combinations/

https://leetcode.com/problems/factor-combinations/discuss/68039/A-simple-java-solution

https://leetcode.com/problems/factor-combinations/discuss/68040/My-Recursive-DFS-Java-Solution

https://leetcode.com/problems/factor-combinations/discuss/68132/Share-simple-C%2B%2B-DFS-accepted-solution

LeetCode All in One 题目讲解汇总(持续更新中...)

[LeetCode] Factor Combinations 因子组合的更多相关文章

  1. [LeetCode] 254. Factor Combinations 因子组合

    Numbers can be regarded as product of its factors. For example, 8 = 2 x 2 x 2; = 2 x 4. Write a func ...

  2. LeetCode Factor Combinations

    原题链接在这里:https://leetcode.com/problems/factor-combinations/ 题目: Numbers can be regarded as product of ...

  3. Factor Combinations

    Factor Combinations Problem: Numbers can be regarded as product of its factors. For example, 8 = 2 x ...

  4. [Swift]LeetCode254.因子组合 $ Factor Combinations

    Numbers can be regarded as product of its factors. For example, 8 = 2 x 2 x 2; = 2 x 4. Write a func ...

  5. Leetcode 254. Factor Combinations

    Numbers can be regarded as product of its factors. For example, 8 = 2 x 2 x 2; = 2 x 4. Write a func ...

  6. [leetcode]254. Factor Combinations因式组合

    Numbers can be regarded as product of its factors. For example, 8 = 2 x 2 x 2; = 2 x 4. Write a func ...

  7. 254. Factor Combinations

    题目: Numbers can be regarded as product of its factors. For example, 8 = 2 x 2 x 2; = 2 x 4. Write a ...

  8. [LeetCode] Letter Combinations of a Phone Number 电话号码的字母组合

    Given a digit string, return all possible letter combinations that the number could represent. A map ...

  9. [Locked] Factor combinations

    Numbers can be regarded as product of its factors. For example, 8 = 2 x 2 x 2; = 2 x 4. Write a func ...

随机推荐

  1. Java DNS查询内部实现

    源码分析 在Java中,DNS相关的操作都是通过通过InetAddress提供的API实现的.比如查询域名对应的IP地址: String dottedQuadIpAddress = InetAddre ...

  2. .NET缓存框架CacheManager在混合式开发框架中的应用(1)-CacheManager的介绍和使用

    在我们开发的很多分布式项目里面(如基于WCF服务.Web API服务方式),由于数据提供涉及到数据库的相关操作,如果客户端的并发数量超过一定的数量,那么数据库的请求处理则以爆发式增长,如果数据库服务器 ...

  3. C++智能指针

    引用计数技术及智能指针的简单实现 基础对象类 class Point { public: Point(int xVal = 0, int yVal = 0) : x(xVal), y(yVal) { ...

  4. MongoDB安装使用

    标签: MongoDB 参考链接:Windows上安装MongoDB教程 1. 官方下载 MongoDB提供了可用于32位和64位系统的预编译二进制包,你可以从MongoDB官网下载安装,MongoD ...

  5. 原生js可爱糖果数字时间特效

    效果展示:http://hovertree.com/texiao/js/35/ 数字采用漂亮的糖果皮肤设计 效果图: 代码如下: <!DOCTYPE html> <html> ...

  6. jquery+ajax+struts2

    AJAX 是与服务器交换数据的艺术,它在不重载全部页面的情况下,实现了对部分网页的更新.编写常规的 AJAX 代码并不容易,因为不同的浏览器对 AJAX 的实现并不相同.这意味着您必须编写额外的代码对 ...

  7. DNS原理及其解析过程 精彩剖析

    本文章转自下面:http://369369.blog.51cto.com/319630/812889 DNS原理及其解析过程 精彩剖析 网络通讯大部分是基于TCP/IP的,而TCP/IP是基于IP地址 ...

  8. Windows10应用Docker部署DoNet Core

    Win10和Mac稳定版的Docker发布了,之前看了下徐磊老师的几篇Docker4Dotnet的文章http://devopshub.cn/2016/07/08/docker4dotnet-1-ov ...

  9. K60——寄存器

    (1)PTx_BASE_PTR为GPIO寄存器结构体基址指针(PTR即point to register,x=A/B/C/D/E) /* GPIO - Peripheral instance base ...

  10. iOS 小谈开发者中的个人、组织(公司、企业)账号

    苹果对开发者主要分为3类:个人.组织(公司.企业).教育机构.即: 1.个人(Individual) 2.组织(Organizations) 组织类又分为2个小类: (1)公司(Company) (2 ...