zoukankan      html  css  js  c++  java
  • [LC] 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 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]
    ]

    class Solution {
        public List<List<Integer>> getFactors(int n) {
            List<List<Integer>> res = new ArrayList<>();
            helper(res, new ArrayList<>(), n, 2);
            return res;
        }
        
        private void helper(List<List<Integer>> res, List<Integer> list, int n, int start) {
            if (n == 1) {
                // exclude the self case
                if (list.size() > 1) {
                    res.add(new ArrayList<>(list));
                    return;
                }
            }
            for (int i = start; i <= n; i++) {
                if (n % i == 0) {
                    list.add(i);
                    helper(res, list, n / i, i);
                    list.remove(list.size() - 1);
                }
            }
        }
    }
    class Solution {
        public List<List<Integer>> getFactors(int n) {
            List<Integer> factors = new ArrayList<>();
            for (int i = 2; i * i <= n; i++) {
                if (n % i == 0) {
                    factors.add(i);
                    if (i * i != n) {
                        factors.add(n / i);
                    }
                }
            }
            // Collections.sort(factors);
            // System.out.println(factors);
            List<List<Integer>> res = new ArrayList<>();
            dfs(res, factors, new ArrayList<Integer>(), 1, n, 0);
            return res;
        }
        
            private void dfs(List<List<Integer>> res, List<Integer> factors, List<Integer> list, int cur, int n, int index) {
            if (cur > n) {
                return;
            }
            if (cur == n) {
                if (list.size() > 1) {
                    res.add(new ArrayList<>(list));                
                }
                return;
            }
            // System.out.println(index);
            for (int i = index; i < factors.size(); i++) {
                list.add(factors.get(i));
                dfs(res, factors, list, cur * factors.get(i), n, i);
                list.remove(list.size() - 1);
            }
        }
    }
  • 相关阅读:
    新书推荐——《How We Test Software at Microsoft》
    [ZZ]采访与书摘:使用C#进行基于模型的软件测试和分析
    Adding Different Types of Data Sources to a Web Test
    [ZZ]为什么传统的自动化测试工具会扼杀敏捷?
    很久没有这么High了
    留图以纪念这次地震
    white——Automate windows applications
    WatiN、Wax、WatiN Test Recorder开源自动化测试框架
    绝版的T61普屏
    有感于公司搬家
  • 原文地址:https://www.cnblogs.com/xuanlu/p/12508886.html
Copyright © 2011-2022 走看看