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

本文共 2846 字,大约阅读时间需要 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:

 

转载于:https://www.cnblogs.com/yrbbest/p/5014873.html

你可能感兴趣的文章
Android 交错 GridView
查看>>
(2)把BlackBerry作为插件安装到已有的Eclipse中
查看>>
VUE-es6
查看>>
MySQL-5.7 高阶语法及流程控制
查看>>
C++学习笔记(十)——向上造型
查看>>
2017/6/16
查看>>
ListView 分组 显示网络数据
查看>>
First Pro:初识JS
查看>>
jenkins自动打IOS包(转发)
查看>>
Java列表
查看>>
为MyEclipse 9/10中的html/JSP编辑器添加代码自动提示
查看>>
待解决)leetcode 路径和 dfs 线序遍历
查看>>
Contest - 第10届“新秀杯”ACM程序设计大赛网络预选赛 赛后信息(晋级名单)
查看>>
C型USB能阻止危险充电器通过USB传播恶意软件
查看>>
lvs realserver 配置VIP
查看>>
Fatal error: require_once() [function.require]: Failed opening required 'Zend/Application.php'
查看>>
UIWebView 本地缓存
查看>>
Chapter 1 Exercises & Problems
查看>>
Java IO: ByteArrayInputStream
查看>>
spring boot configuration annotation processor not found in classpath
查看>>