博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
254. Factor Combinations
阅读量:6488 次
发布时间:2019-06-24

本文共 2795 字,大约阅读时间需要 9 分钟。

题目:

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. Each combination's factors must be sorted ascending, for example: The factors of 2 and 6 is [2, 6], not [6, 2].
  2. You may assume that n is always positive.
  3. Factors should be greater than 1 and less than n.

 

Examples: 

input: 1
output: 

[]
input: 
37
output: 
[]
input: 
12
output:
[  [2, 6],  [2, 2, 3],  [3, 4]]
input: 
32
output:
[  [2, 16],  [2, 2, 8],  [2, 2, 2, 4],  [2, 2, 2, 2, 2],  [2, 4, 4],  [4, 8]]

链接: 

题解:

求一个数的所有factor,这里我们又想到了DFS + Backtracking, 需要注意的是,factor都是>= 2的,并且在此题里,这个数本身不能算作factor,所以我们有了当n <= 1时的判断 if(list.size() > 1) add the result to res.

Time Complexity - O(2n), Space Complexity - O(n).

public class Solution {    public List
> getFactors(int n) { List
> res = new ArrayList<>(); List
list = new ArrayList<>(); getFactors(res, list, n, 2); return res; } private void getFactors(List
> res, List
list, int n, int factor) { if(n <= 1) { if(list.size() > 1) res.add(new ArrayList
(list)); return; } for(int i = factor; i <= n; i++) { if(n % i == 0) { list.add(i); getFactors(res, list, n / i, i); list.remove(list.size() - 1); } } }}

 

二刷:

还是使用了一刷的办法,dfs + backtracking。但递归结束的条件更新成了n == 1。 但是速度并不是很快,原因是没有做剪枝。我们其实可以设置一个upper limit,即当i > Math.sqrt(n)的时候,我们不能继续进行下一轮递归,此时就要跳出了。

Java:

public class Solution {    public List
> getFactors(int n) { List
> res = new ArrayList<>(); if (n <= 1) return res; getFactors(res, new ArrayList<>(), n, 2); return res; } private void getFactors(List
> res, List
list, int n, int pos) { if (n == 1) { if (list.size() > 1) res.add(new ArrayList<>(list)); return; } for (int i = pos; i <= n; i++) { if (n % i == 0) { list.add(i); getFactors(res, list, n / i, i); list.remove(list.size() - 1); } } }}

 

Update: 使用@yuhangjiang的方法,只用计算 2到sqrt(n)的这么多因子,大大提高了速度。

public class Solution {    public List
> getFactors(int n) { List
> res = new ArrayList<>(); if (n <= 1) return res; getFactors(res, new ArrayList<>(), n, 2); return res; } private void getFactors(List
> res, List
list, int n, int pos) { for (int i = pos; i <= Math.sqrt(n); i++) { if (n % i == 0 && n / i >= i) { list.add(i); list.add(n / i); res.add(new ArrayList<>(list)); list.remove(list.size() - 1); getFactors(res, list, n / i, i); list.remove(list.size() - 1); } } }}

 

 

 

 

Reference:

 

转载地址:http://uoauo.baihongyu.com/

你可能感兴趣的文章
自然语言理解势头正强劲,可总还是缺点啥
查看>>
【python图像处理】给图像添加透明度(alpha通道)
查看>>
区块链与微服务天生是一对
查看>>
VDI市场:探寻企业影子IT风险来源|
查看>>
阿里云黄海宇:窄带高清2.0——让直播更惊艳的魔术
查看>>
SID颁发全球显示行业个人奖项
查看>>
解决使用turtle库的tkinter错误
查看>>
动态创建的文本框想要加上jQuery的datepicker功能变成日期选择控件该怎么办?
查看>>
照着官方文档学习react
查看>>
一、信息安全所面临的挑战与对策
查看>>
初涉SQL Server性能问题(2/4):列出等待资源的会话
查看>>
Android填坑系列:Android JSONObject 中对key-value为null的特殊处理
查看>>
连连看.NET 1.41 发布(改造路径提示,提供算法源码)
查看>>
贴一张图,Javascript 类型系统与对象系统
查看>>
【记录】WCF IIS 404
查看>>
mybatis错误之配置文件属性配置问题
查看>>
【OpenCV学习】XML的读写
查看>>
当月的所有周日 倒计时显示当年剩下的天时分秒 公历转农历(.net)
查看>>
linux基本命令
查看>>
新网云服务导致八爪鱼招标网近一天宕机,提交工单竟谎报问题已修复
查看>>