254. Factor Combinations
Числа можно рассматривать как произведение их множителей.
На예제, 8 = 2 x 2 x 2 = 2 x 4.
given 정수 n, return все возможные комбинации его множителей. Вы можете вернуть ответ в любом порядке.
Обратите внимание, что множители должны быть в диапазоне [2, n - 1].
예제:
Input: n = 1
Output: []
C# 해법
매칭됨/원본using System;
using System.Collections.Generic;
public class Solution {
private void Backtracking(LinkedList<int> factors, List<IList<int>> ans) {
if (factors.Count > 1) {
ans.Add(new List<int>(factors));
}
int lastFactor = factors.Last.Value;
factors.RemoveLast();
for (int i = factors.Count == 0 ? 2 : factors.Last.Value; i <= lastFactor / i; ++i) {
if (lastFactor % i == 0) {
factors.AddLast(i);
factors.AddLast(lastFactor / i);
Backtracking(factors, ans);
factors.RemoveLast();
factors.RemoveLast();
}
}
factors.AddLast(lastFactor);
C++ 해법
자동 초안, 제출 전 검토#include <bits/stdc++.h>
using namespace std;
// Auto-generated C++ draft from the C# solution. Review containers, LINQ and helper types before submit.
class Solution {
public:
private void Backtracking(LinkedList<int> factors, List<vector<int>> ans) {
if (factors.size() > 1) {
ans.push_back(new List<int>(factors));
}
int lastFactor = factors.Last.Value;
factors.RemoveLast();
for (int i = factors.size() == 0 ? 2 : factors.Last.Value; i <= lastFactor / i; ++i) {
if (lastFactor % i == 0) {
factors.AddLast(i);
factors.AddLast(lastFactor / i);
Backtracking(factors, ans);
factors.RemoveLast();
factors.RemoveLast();
}
}
factors.AddLast(lastFactor);
Java 해법
자동 초안, 제출 전 검토import java.util.*;
import java.math.*;
// Auto-generated Java draft from the C# solution. Review API differences before LeetCode submit.
public class Solution {
private void Backtracking(LinkedList<int> factors, List<List<int>> ans) {
if (factors.size() > 1) {
ans.add(new List<int>(factors));
}
int lastFactor = factors.Last.Value;
factors.RemoveLast();
for (int i = factors.size() == 0 ? 2 : factors.Last.Value; i <= lastFactor / i; ++i) {
if (lastFactor % i == 0) {
factors.AddLast(i);
factors.AddLast(lastFactor / i);
Backtracking(factors, ans);
factors.RemoveLast();
factors.RemoveLast();
}
}
factors.AddLast(lastFactor);
JavaScript 해법
매칭됨/원본class Solution {
backtracking(factors, ans) {
if (factors.length > 1) {
ans.push([...factors]);
}
const lastFactor = factors.pop();
const start = factors.length === 0 ? 2 : factors[factors.length - 1];
for (let i = start; i * i <= lastFactor; ++i) {
if (lastFactor % i === 0) {
factors.push(i, lastFactor / i);
this.backtracking(factors, ans);
factors.pop();
factors.pop();
}
}
factors.push(lastFactor);
}
getFactors(n) {
const ans = [];
this.backtracking([n], ans);
return ans;
}
}
Go 해법
매칭됨/원본package main
func backtracking(factors []int, ans *[][]int) {
if len(factors) > 1 {
combo := make([]int, len(factors))
copy(combo, factors)
*ans = append(*ans, combo)
}
lastFactor := factors[len(factors)-1]
factors = factors[:len(factors)-1]
start := 2
if len(factors) > 0 {
start = factors[len(factors)-1]
}
for i := start; i*i <= lastFactor; i++ {
if lastFactor%i == 0 {
factors = append(factors, i)
factors = append(factors, lastFactor/i)
backtracking(factors, ans)
factors = factors[:len(factors)-2]
}
}
factors = append(factors, lastFactor)
}
func getFactors(n int) [][]int {
var ans [][]int
backtracking([]int{n}, &ans)
return ans
}
Algorithm
1️⃣
Определите вспомогательную функцию backtracking, которая принимает два параметра: factors (список множителей) и ans (список списков для сохранения всех комбинаций множителей). Начните вызов backtracking с factors, содержащим только n, и пустым списком ans.
2️⃣
Основная логика функции backtracking:
Если размер factors больше 1, добавьте его копию в ans, так как это одно из желаемых решений.
Получите последний element factors (lastFactor) и удалите его из factors.
Если factors пуст, итерируйте i от 2. В противном случае, итерируйте i от последнего значения в factors. Итерируйте, пока i <= lastFactor / i.
Для каждого i, если lastFactor % i == 0, добавьте i и lastFactor / i в factors и вызовите backtracking(factors, ans).
Восстановите список (откат) factors, удалив последние два elementа из factors.
Восстановите список (откат) factors, добавив обратно lastFactor.
3️⃣
В конце выполнения, ans будет содержать все возможные комбинации множителей числа n.
😎
Vacancies for this task
활성 채용 with overlapping task tags are 표시됨.