Leetcode - Permutations I,II
发布日期:2025-04-04 18:46:39 浏览次数:10 分类:精选文章

本文共 2297 字,大约阅读时间需要 7 分钟。

全排列问题是回溯法的典型例子。可行解的组成形式是给定数组中的所有数的组合,因此可作为可行解的判定条件。每次需要在剩下可被选中的集合中选择一个,创建mask数组。

class Solution {public:    void dfs(vector
vct, vector
cur, const vector
& nums, vector
& used) { if (cur.size() == nums.size()) { vct.push_back(cur); return; } for (int i = 0; i < nums.size(); ++i) { if (used[i] == 0) { cur.push_back(nums[i]); used[i] = 1; dfs(vct, cur, nums, used); used[i] = 0; cur.pop_back(); } } } vector
> permute(const vector
& nums) { vector
> vct; if (nums.size() <= 0) return vct; vector
cur; vector
used(nums.size(), false); dfs(vct, cur, nums, used); return vct; }};

diff:需要考虑val1 = val2的情况,需排序将相同元素聚类,参考前文处理重复的方法。

class Solution {public:    void dfs(vector
vct, vector
cur, const vector
& nums, vector
& used) { if (cur.size() == nums.size()) { vct.push_back(cur); return; } for (int i = 0; i < nums.size(); ++i) { if (used[i]) continue; int pre_index = i - 1; bool repeated = false; while (pre_index >= 0 && nums[pre_index] == nums[i]) { if (used[pre_index]) { repeated = true; break; } --pre_index; } if (repeated) continue; cur.push_back(nums[i]); used[i] = true; dfs(vct, cur, nums, used); used[i] = false; cur.pop_back(); } } vector
> permuteUnique(const vector
& nums) { vector
> vct; if (nums.size() <= 0) return vct; vector
cur; vector
used(nums.size(), false); dfs(vct, cur, nums, used); return vct; }};

注意:请根据实际需求补充具体内容,确保代码符合上下文,并维护功能性和编译正确性。

上一篇:Leetcode -- 258 数位相加
下一篇:LeetCode - 9. 回文数

发表评论

最新留言

表示我来过!
[***.240.166.169]2025年05月06日 23时07分36秒