From 3f430fb85e27b0beda2480b05e7254bdeeeaf619 Mon Sep 17 00:00:00 2001 From: krahets Date: Thu, 27 Apr 2023 01:18:18 +0800 Subject: [PATCH] Update the code of permutations i and ii --- codes/c/utils/list_node.h | 1 + .../chapter_backtracking/permutations_i.cpp | 27 +++++++++++-------- .../chapter_backtracking/permutations_ii.cpp | 27 +++++++++++-------- .../chapter_backtracking/permutations_i.java | 25 ++++++++++------- .../chapter_backtracking/permutations_ii.java | 25 ++++++++++------- .../chapter_backtracking/permutations_i.py | 23 +++++++++------- .../chapter_backtracking/permutations_ii.py | 23 +++++++++------- 7 files changed, 91 insertions(+), 60 deletions(-) diff --git a/codes/c/utils/list_node.h b/codes/c/utils/list_node.h index cebe4683..29820e5d 100644 --- a/codes/c/utils/list_node.h +++ b/codes/c/utils/list_node.h @@ -3,6 +3,7 @@ * Created Time: 2023-01-09 * Author: Reanon (793584285@qq.com) */ + #ifndef LIST_NODE_H #define LIST_NODE_H diff --git a/codes/cpp/chapter_backtracking/permutations_i.cpp b/codes/cpp/chapter_backtracking/permutations_i.cpp index 41704cee..f20505ca 100644 --- a/codes/cpp/chapter_backtracking/permutations_i.cpp +++ b/codes/cpp/chapter_backtracking/permutations_i.cpp @@ -18,26 +18,31 @@ void backtrack(vector &state, const vector &choices, vector &sel int choice = choices[i]; // 剪枝:不允许重复选择元素 且 不允许重复选择相等元素 if (!selected[i]) { - // 尝试 - selected[i] = true; // 做出选择 - state.push_back(choice); // 更新状态 + // 尝试:做出选择,更新状态 + selected[i] = true; + state.push_back(choice); backtrack(state, choices, selected, res); - // 回退 - selected[i] = false; // 撤销选择 - state.pop_back(); // 恢复到之前的状态 + // 回退:撤销选择,恢复到之前的状态 + selected[i] = false; + state.pop_back(); } } } +/* 全排列 I */ +vector> permutationsI(vector nums) { + vector state; + vector selected(nums.size(), false); + vector> res; + backtrack(state, nums, selected, res); + return res; +} + /* Driver Code */ int main() { vector nums = {1, 2, 3}; - // 回溯算法 - vector state; - vector selected(nums.size(), false); - vector> res; - backtrack(state, nums, selected, res); + vector> res = permutationsI(nums); cout << "输入数组 nums = "; printVector(nums); diff --git a/codes/cpp/chapter_backtracking/permutations_ii.cpp b/codes/cpp/chapter_backtracking/permutations_ii.cpp index a164f128..21144d1b 100644 --- a/codes/cpp/chapter_backtracking/permutations_ii.cpp +++ b/codes/cpp/chapter_backtracking/permutations_ii.cpp @@ -19,27 +19,32 @@ void backtrack(vector &state, const vector &choices, vector &sel int choice = choices[i]; // 剪枝:不允许重复选择元素 且 不允许重复选择相等元素 if (!selected[i] && duplicated.find(choice) == duplicated.end()) { - // 尝试 + // 尝试:做出选择,更新状态 duplicated.emplace(choice); // 记录选择过的元素值 - selected[i] = true; // 做出选择 - state.push_back(choice); // 更新状态 + selected[i] = true; + state.push_back(choice); backtrack(state, choices, selected, res); - // 回退 - selected[i] = false; // 撤销选择 - state.pop_back(); // 恢复到之前的状态 + // 回退:撤销选择,恢复到之前的状态 + selected[i] = false; + state.pop_back(); } } } +/* 全排列 II */ +vector> permutationsII(vector nums) { + vector state; + vector selected(nums.size(), false); + vector> res; + backtrack(state, nums, selected, res); + return res; +} + /* Driver Code */ int main() { vector nums = {1, 1, 2}; - // 回溯算法 - vector state; - vector selected(nums.size(), false); - vector> res; - backtrack(state, nums, selected, res); + vector> res = permutationsII(nums); cout << "输入数组 nums = "; printVector(nums); diff --git a/codes/java/chapter_backtracking/permutations_i.java b/codes/java/chapter_backtracking/permutations_i.java index 340fb476..19b979b3 100644 --- a/codes/java/chapter_backtracking/permutations_i.java +++ b/codes/java/chapter_backtracking/permutations_i.java @@ -21,24 +21,29 @@ public class permutations_i { int choice = choices[i]; // 剪枝:不允许重复选择元素 且 不允许重复选择相等元素 if (!selected[i]) { - // 尝试 - selected[i] = true; // 做出选择 - state.add(choice); // 更新状态 + // 尝试:做出选择,更新状态 + selected[i] = true; + state.add(choice); backtrack(state, choices, selected, res); - // 回退 - selected[i] = false; // 撤销选择 - state.remove(state.size() - 1); // 恢复到之前的状态 + // 回退:撤销选择,恢复到之前的状态 + selected[i] = false; + state.remove(state.size() - 1); } } } + /* 全排列 I */ + static List> permutationsI(int[] nums) { + List> res = new ArrayList>(); + backtrack(new ArrayList(), nums, new boolean[nums.length], res); + return res; + } + public static void main(String[] args) { int[] nums = { 1, 2, 3 }; - List> res = new ArrayList>(); - // 回溯算法 - backtrack(new ArrayList(), nums, new boolean[nums.length], res); - + List> res = permutationsI(nums); + System.out.println("输入数组 nums = " + Arrays.toString(nums)); System.out.println("所有排列 res = " + res); } diff --git a/codes/java/chapter_backtracking/permutations_ii.java b/codes/java/chapter_backtracking/permutations_ii.java index f48f75c4..300bcc79 100644 --- a/codes/java/chapter_backtracking/permutations_ii.java +++ b/codes/java/chapter_backtracking/permutations_ii.java @@ -10,7 +10,7 @@ import java.util.*; public class permutations_ii { /* 回溯算法:全排列 II */ - public static void backtrack(List state, int[] choices, boolean[] selected, List> res) { + static void backtrack(List state, int[] choices, boolean[] selected, List> res) { // 当状态长度等于元素数量时,记录解 if (state.size() == choices.length) { res.add(new ArrayList(state)); @@ -22,24 +22,29 @@ public class permutations_ii { int choice = choices[i]; // 剪枝:不允许重复选择元素 且 不允许重复选择相等元素 if (!selected[i] && !duplicated.contains(choice)) { - // 尝试 + // 尝试:做出选择,更新状态 duplicated.add(choice); // 记录选择过的元素值 - selected[i] = true; // 做出选择 - state.add(choice); // 更新状态 + selected[i] = true; + state.add(choice); backtrack(state, choices, selected, res); - // 回退 - selected[i] = false; // 撤销选择 - state.remove(state.size() - 1); // 恢复到之前的状态 + // 回退:撤销选择,恢复到之前的状态 + selected[i] = false; + state.remove(state.size() - 1); } } } + /* 全排列 II */ + static List> permutationsII(int[] nums) { + List> res = new ArrayList>(); + backtrack(new ArrayList(), nums, new boolean[nums.length], res); + return res; + } + public static void main(String[] args) { int[] nums = { 1, 2, 2 }; - List> res = new ArrayList>(); - // 回溯算法 - backtrack(new ArrayList(), nums, new boolean[nums.length], res); + List> res = permutationsII(nums); System.out.println("输入数组 nums = " + Arrays.toString(nums)); System.out.println("所有排列 res = " + res); diff --git a/codes/python/chapter_backtracking/permutations_i.py b/codes/python/chapter_backtracking/permutations_i.py index aaaa77a4..3b36445b 100644 --- a/codes/python/chapter_backtracking/permutations_i.py +++ b/codes/python/chapter_backtracking/permutations_i.py @@ -22,22 +22,27 @@ def backtrack( for i, choice in enumerate(choices): # 剪枝:不允许重复选择元素 if not selected[i]: - # 尝试 - selected[i] = True # 做出选择 - state.append(choice) # 更新状态 + # 尝试:做出选择,更新状态 + selected[i] = True + state.append(choice) backtrack(state, choices, selected, res) - # 回退 - selected[i] = False # 撤销选择 - state.pop() # 恢复到之前的状态 + # 回退:撤销选择,恢复到之前的状态 + selected[i] = False + state.pop() + + +def permutations_i(nums: list[int]) -> list[list[int]]: + """全排列 I""" + res = [] + backtrack(state=[], choices=nums, selected=[False] * len(nums), res=res) + return res """Driver Code""" if __name__ == "__main__": nums = [1, 2, 3] - res = [] - # 回溯算法 - backtrack(state=[], choices=nums, selected=[False] * len(nums), res=res) + res = permutations_i(nums) print(f"输入数组 nums = {nums}") print(f"所有排列 res = {res}") diff --git a/codes/python/chapter_backtracking/permutations_ii.py b/codes/python/chapter_backtracking/permutations_ii.py index 1aa9e84b..552a16b0 100644 --- a/codes/python/chapter_backtracking/permutations_ii.py +++ b/codes/python/chapter_backtracking/permutations_ii.py @@ -23,23 +23,28 @@ def backtrack( for i, choice in enumerate(choices): # 剪枝:不允许重复选择元素 且 不允许重复选择相等元素 if not selected[i] and choice not in duplicated: - # 尝试 + # 尝试:做出选择,更新状态 duplicated.add(choice) # 记录选择过的元素值 - selected[i] = True # 做出选择 - state.append(choice) # 更新状态 + selected[i] = True + state.append(choice) backtrack(state, choices, selected, res) - # 回退 - selected[i] = False # 撤销选择 - state.pop() # 恢复到之前的状态 + # 回退:撤销选择,恢复到之前的状态 + selected[i] = False + state.pop() + + +def permutations_ii(nums: list[int]) -> list[list[int]]: + """全排列 II""" + res = [] + backtrack(state=[], choices=nums, selected=[False] * len(nums), res=res) + return res """Driver Code""" if __name__ == "__main__": nums = [1, 2, 2] - res = [] - # 回溯算法 - backtrack(state=[], choices=nums, selected=[False] * len(nums), res=res) + res = permutations_ii(nums) print(f"输入数组 nums = {nums}") print(f"所有排列 res = {res}")