返回介绍

solution / 0200-0299 / 0254.Factor Combinations / README

发布于 2024-06-17 01:04:02 字数 3382 浏览 0 评论 0 收藏 0

254. 因子的组合

English Version

题目描述

整数可以被看作是其因子的乘积。

例如:

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

请实现一个函数,该函数接收一个整数 _n_ 并返回该整数所有的因子组合。

注意:

  1. 你可以假定 _n_ 为永远为正数。
  2. 因子必须大于 1 并且小于 _n_。

示例 1:

输入: 1
输出: []

示例 2:

输入: 37
输出: []

示例 3:

输入: 12
输出:
[
  [2, 6],
  [2, 2, 3],
  [3, 4]
]

示例 4:

输入: 32
输出:
[
  [2, 16],
  [2, 2, 8],
  [2, 2, 2, 4],
  [2, 2, 2, 2, 2],
  [2, 4, 4],
  [4, 8]
]

解法

方法一:回溯

我们设计函数 $dfs(n, i)$,其中 $n$ 表示当前待分解的数,$i$ 表示当前分解的数的最大因子,函数的作用是将 $n$ 分解为若干个因子,其中每个因子都不小于 $i$,并将所有分解结果保存到 $ans$ 中。

在函数 $dfs(n, i)$ 中,我们从 $i$ 开始枚举 $n$ 的因子 $j$,如果 $j$ 是 $n$ 的因子,那么我们将 $j$ 加入当前分解结果,然后继续分解 $n / j$,即调用函数 $dfs(n / j, j)$。

时间复杂度 $O(\sqrt{n})$。

class Solution:
  def getFactors(self, n: int) -> List[List[int]]:
    def dfs(n, i):
      if t:
        ans.append(t + [n])
      j = i
      while j * j <= n:
        if n % j == 0:
          t.append(j)
          dfs(n // j, j)
          t.pop()
        j += 1

    t = []
    ans = []
    dfs(n, 2)
    return ans
class Solution {
  private List<Integer> t = new ArrayList<>();
  private List<List<Integer>> ans = new ArrayList<>();

  public List<List<Integer>> getFactors(int n) {
    dfs(n, 2);
    return ans;
  }

  private void dfs(int n, int i) {
    if (!t.isEmpty()) {
      List<Integer> cp = new ArrayList<>(t);
      cp.add(n);
      ans.add(cp);
    }
    for (int j = i; j <= n / j; ++j) {
      if (n % j == 0) {
        t.add(j);
        dfs(n / j, j);
        t.remove(t.size() - 1);
      }
    }
  }
}
class Solution {
public:
  vector<vector<int>> getFactors(int n) {
    vector<int> t;
    vector<vector<int>> ans;
    function<void(int, int)> dfs = [&](int n, int i) {
      if (t.size()) {
        vector<int> cp = t;
        cp.emplace_back(n);
        ans.emplace_back(cp);
      }
      for (int j = i; j <= n / j; ++j) {
        if (n % j == 0) {
          t.emplace_back(j);
          dfs(n / j, j);
          t.pop_back();
        }
      }
    };
    dfs(n, 2);
    return ans;
  }
};
func getFactors(n int) [][]int {
  t := []int{}
  ans := [][]int{}
  var dfs func(n, i int)
  dfs = func(n, i int) {
    if len(t) > 0 {
      ans = append(ans, append(slices.Clone(t), n))
    }
    for j := i; j <= n/j; j++ {
      if n%j == 0 {
        t = append(t, j)
        dfs(n/j, j)
        t = t[:len(t)-1]
      }
    }
  }
  dfs(n, 2)
  return ans
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文