题目

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

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:

Each combination’s factors must be sorted ascending, for example: The factors of 2 and 6 is [2, 6], not [6, 2].
You may assume that n is always positive.
Factors should be greater than 1 and less than n.

Examples:

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

回溯解法1

思路解析:
因子分解而且不能重复,可以通过后面的因子必须大于等于前面的因子大来规避。

  1. 退出条件n==1, 如果list.size() > 1才是符合解,排除掉不符合要求解[1, n]
  2. 要么选择,要么不选择list.remove(list.size() - 1)
package backtracking;import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;// https://leetcode.com/problems/factor-combinations/
public class FactorCombinations {public static void main(String[] args) {FactorCombinations obj = new FactorCombinations();int n = 12;List<List<Integer>> resultList = obj.getFactors(12);System.out.println(Arrays.toString(resultList.toArray()));}public List<List<Integer>> getFactors(int n) {List<List<Integer>> resultList = new ArrayList<List<Integer>>();// DFSdfs(resultList, new ArrayList<Integer>(), n, 2);//dfs1(resultList, new ArrayList<Integer>(), n, 2);return resultList;}private void dfs(List<List<Integer>> resultList, List<Integer> list, int n, int start) {// exitif (n == 1) {if (list.size() > 1) {resultList.add(new ArrayList<Integer>(list));}return;}for (int i = start; i <= n; i++) {if (n % i == 0) {list.add(i);dfs(resultList, list, n / i, i);list.remove(list.size() - 1);}}}}

回溯解法2

此解法是对上一个解法的优化,因为没必要遍历从[2, n], 遍历到√n的开平方就好。 这里容易出错的地方在于

  1. 列表需要新的列表List<Integer> newList = new ArrayList<Integer>(list);因为这里没有把结果剔除出去。如果这里要用移除发,需要移除两次,一次是把商移除出去,一次是把上一个符合结果的因子移除出去。这里用回溯方法三记录一下。
  2. 被整除后需要把剩下的因子在最后加入中间结果中newList.add(n / i),并添加到最终结果集resultList.add(newList)
package backtracking;import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;// https://leetcode.com/problems/factor-combinations/
public class FactorCombinations {public static void main(String[] args) {FactorCombinations obj = new FactorCombinations();int n = 12;List<List<Integer>> resultList = obj.getFactors(12);System.out.println(Arrays.toString(resultList.toArray()));}public List<List<Integer>> getFactors(int n) {List<List<Integer>> resultList = new ArrayList<List<Integer>>();// DFS//dfs(resultList, new ArrayList<Integer>(), n, 2);dfs1(resultList, new ArrayList<Integer>(), n, 2);return resultList;}private void dfs1(List<List<Integer>> resultList, List<Integer> list, int n, int start) {for (int i = start; i * i < n; i++) {if (n % i == 0) {List<Integer> newList = new ArrayList<Integer>(list);newList.add(i);dfs1(resultList, newList, n / i, i);newList.add(n / i);resultList.add(newList);}}}
}

回溯解法3

思路解析:
此解法是对上一个解法的优化,因为没必要遍历从[2, n], 遍历到√n的开平方就好。 这里容易出错的地方在于

  1. 这里list要用移除发,需要移除两次,一次是把商移除出去,一次是把上一个符合结果的因子移除出去。这里用回溯方法三记录一下
private void dfs2(List<List<Integer>> resultList, List<Integer> list, int n, int start) {for (int i = start; i * i < n; i++) {if (n % i == 0) {list.add(i);dfs2(resultList, list, n / i, i);list.add(n / i);resultList.add(new ArrayList<Integer>(list));list.remove(list.size() - 1);list.remove(list.size() - 1);}}}

代码下载

https://github.com/zgpeace/awesome-java-leetcode/blob/master/code/LeetCode/src/backtracking/FactorCombinations.java

算法:回溯十八 Factor Combinations 因子组合(3种解法)相关推荐

  1. 莱布尼兹普遍演算的定义注释--逻辑与算法之十八

    莱布尼兹普遍演算的定义注释–逻辑与算法之十八 证明完了24个命题,在片断20的最后部分,莱布尼兹对于他的演算中提到的定义和公理给出了一大段注释.首先注释的是片断20给出的定义3,4,5,6. 这非常自 ...

  2. LeetCode算法题-Number Complement(Java实现-五种解法)

    这是悦乐书的第240次更新,第253篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第107题(顺位题号是476).给定正整数,输出其补码数.补充策略是翻转其二进制表示的位 ...

  3. 通信算法之七十八:无人机反制—精华总结

    (本文站在无线通信从业者的角度,进行总结记录) 1.无人机的探测和识别 如何发现无人机? 实现对无人机的探测和识别,有雷达探测.无线电信号监测.光电识别跟踪.声音监测等技术. 1.2无线电信号监测 利 ...

  4. 算法总结——八皇后问题(三种解法)

    问题描述 会下国际象棋的人都很清楚:皇后可以在横.竖.斜线上不限步数地吃掉其他棋子.如何将8个皇后放在棋盘上(有8 * 8个方格),使它们谁也不能被吃掉!这就是著名的八皇后问题. 对于某个满足要求的8 ...

  5. 八数码问题的三种解法

    北民大人工智能作业,其他相关作业资料和问题可留言交流   这里没有用课本上的open表和close表的方式,这个问题完全可以看图找规律解出来,而且三个代码(广度.A.A*)没有多少区别,代码相似度极高 ...

  6. 蓝桥杯算法训练 数字游戏 组合数和暴力两种解法

    试题 算法训练 数字游戏 资源限制 时间限制:1.0s 内存限制:256.0MB 问题描述 给定一个1-N的排列a[i],每次将相邻两个数相加,得到新序列,再对新序列重复这样的操作,显然每次得到的序列 ...

  7. OpenCV学习笔记(二十六)——小试SVM算法ml OpenCV学习笔记(二十七)——基于级联分类器的目标检测objdect OpenCV学习笔记(二十八)——光流法对运动目标跟踪Video Ope

    OpenCV学习笔记(二十六)--小试SVM算法ml 总感觉自己停留在码农的初级阶段,要想更上一层,就得静下心来,好好研究一下算法的东西.OpenCV作为一个计算机视觉的开源库,肯定不会只停留在数字图 ...

  8. 八十八、Python | 十大排序算法系列(下篇)

    @Author:Runsen @Date:2020/7/10 人生最重要的不是所站的位置,而是内心所朝的方向.只要我在每篇博文中写得自己体会,修炼身心:在每天的不断重复学习中,耐住寂寞,练就真功,不畏 ...

  9. 【Java数据结构与算法】第五章 递归、迷宫回溯和八皇后问题

    第五章 递归 文章目录 第五章 递归 一.递归 1.概念 2.代码实现 3.递归的规则 二.迷宫回溯 1.要求 2.代码实现 三.八皇后问题 1.介绍 2.思路 3.代码实现 一.递归 1.概念 简单 ...

  10. 青少年编程Playgrounds之十八--算法

    青少年编程Playgrounds之十八–算法 第一关 右手定则 先看地图,多次 运行我的代码 后,能发现,地图上的障碍物(Block)是随机变化的,那么肯定不能编写固定的代码.而本关的提示里已经非常详 ...

最新文章

  1. 与MySQL传统复制相比,GTID有哪些独特的复制姿势?
  2. 深度 | 量子计算技术的研究现状与未来
  3. iphone数据存储之-- Core Data的使用(一)
  4. csharp的几个特殊操作符
  5. Linux设备驱动模型4——平台总线实践
  6. vim 插件cscope 使用
  7. 研华外触发实验PCI1714板卡安装事项
  8. OpenCV官方网站:这里可以白嫖教程、检索API、下载例程
  9. 暗黑复制服务器物品,暗黑2战网环境下复制dupe物品装备
  10. QTcpSocket
  11. U盘重装win10系统专业版——启动盘制作
  12. 解决win10开启移动热点共享手机连上后无法上网的问题
  13. 高仿富途牛牛-组件化(四)-优秀的时钟
  14. P4417 [COCI2006-2007#2] STOL
  15. 集成科大讯飞语音合成
  16. kali CeWL密码攻击工具 Linux字典生成工具 自定义单词列表生成器
  17. 关于Java为什么不推荐使用 import *导包这件小事
  18. c语言实现简单的五子棋游戏
  19. ONLYOFFICE文档V7.2现已发布————插件市场、实时查看器、连写、全新表单字段、UI 更新等
  20. 【1+X Web前端等级考证 】 | Web前端开发中级理论 (附答案)

热门文章

  1. java多线程tasks.add_Java多线程顺序执行
  2. 对文档的编辑过多_Wizard 开源文档管理系统1.0发布啦
  3. ueditor 文件服务器,ueditor-extend: 对百度UEditor编辑器做扩展,开放文件存储方法和获取远程文件列表方法,使其更灵活,更容易和独立的文件服务或者文件存储的云服务结合。...
  4. 美政府停摆或考验机场安检 携枪旅客曾无障碍登机
  5. 是时候表演真正的技术了——11个Git面试题目,你会多少?
  6. 演示使用Metasploit入侵Windows
  7. Java 8 你需要掌握的新特性
  8. jquery 操作表格实例
  9. struts2 传递json对象时的延迟加载异常处理方法
  10. mysql Load Data InFile 的用法