网站的主机博罗网站定制
网站的主机,博罗网站定制,有哪些网站是提供设计图片的,企业官网wordpress主题下载目录 0 引言1 递增子序列1.1 我的解题 2 全排列2.1 我的解题 3 全排列 II3.1 我的解题 #x1f64b;♂️ 作者#xff1a;海码007#x1f4dc; 专栏#xff1a;算法专栏#x1f4a5; 标题#xff1a;算法刷题Day29 |491.递增子序列、46.全排列、47.全排列 II❣️ 寄语♂️ 作者海码007 专栏算法专栏 标题算法刷题Day29 |491.递增子序列、46.全排列、47.全排列 II❣️ 寄语书到用时方恨少事非经过不知难 0 引言
继续回溯算法算法的重要性再一次让我感受到了。必须拿下。
1 递增子序列 文档讲解 视频讲解 做题状态好难呀呜呜 1.1 我的解题
首先分析一下题目给出的nums数组中是可以有重复元素的那也就代表需要进行树层去重操作。然后再看返回的是所有满足条件的子集。
但是这道题有一点不同这道题的nums不能事先排序所以在判断是否需要树层去重的时候就需要遍历之前所有的数据这种方法不行会导致树枝也去重为什么我一开始会说不行呢是因为写的代码没有考虑好j因该从startIndex开始遍历而不是0没想到犯了这么低级的错误困扰了一上午。。所以想了想还是使用哈希法重吧。
那么如何可以使用哈希法进行树层去重呢为什么使用数组遍历的时候就不能保证是同一个树层呢
为什么使用数组遍历的时候就不能保证是同一个树层呢因为我们通过引用传递了used数组这个数组记录了所有树层的使用情况。不是同一层的使用情况。 那么使用一个临时变量记录当前for循环的元素使用情况就可以只记录本层的信息。
所以这种题目的关键就是如何确定用一层的数据使用情况
好吧看了评论区大佬的讲解其使用used数组也可以判断出来 代码如下
#include iostream
#include vector
#include algorithm
using namespace std;class Solution {
public:void backTracing(vectorint nums, int startIndex, vectorint path, vectorvectorint paths) {if (startIndex nums.size()) {return;}vectorbool used(nums.size(), false);for (int i startIndex; i nums.size(); i) {// 如果要插入的数据是小于path中最后一个数则本树枝不满足条件直接跳到下一个循环if (!path.empty() nums[i] path.back()) {continue;}if (i startIndex) {bool needDelete false;for (int j i-1; j startIndex; j--){if (nums[j] nums[i] used[j] false){needDelete true;}}if (needDelete) continue;}used[i] true;path.emplace_back(nums[i]);// 将满足条件的子集加入到结果数组中if (path.size() 2) {paths.emplace_back(path);}backTracing(nums, i 1, path, paths);path.pop_back();used[i] false;}}vectorvectorint findSubsequences(vectorint nums) {vectorint path;vectorvectorint paths;backTracing(nums, 0, path, paths);return paths;}
};2 全排列 文档讲解 视频讲解 做题状态 2.1 我的解题
审题不包含重复数字的数组nums。不需要进行去重。由于是排列所以需要一个参数记录哪些数据被使用过使用过的数据不能重复遍历。
class Solution {
public:void backTracing(vectorint nums, vectorbool used, vectorint path, vectorvectorint paths){if (path.size() nums.size()){paths.emplace_back(path);return;}for (int i 0; i nums.size(); i){if (used[i] false){path.emplace_back(nums[i]);used[i] true;backTracing(nums, used, path, paths);path.pop_back();used[i] false;}}}vectorvectorint permute(vectorint nums) {vectorint path;vectorvectorint paths;vectorbool used(nums.size(), false);backTracing(nums, used, path, paths);return paths;}
};3 全排列 II 文档讲解 视频讲解 做题状态 3.1 我的解题
审题包含重复元素的数组nums所以需要进行去重。
其实就是前面的题目的结合版本
class Solution {
public:void backTracing(vectorint nums, vectorbool used, vectorint path, vectorvectorint paths){if (path.size() nums.size()){paths.emplace_back(path);return;}for (int i 0; i nums.size(); i){if (i 0 nums[i] nums[i - 1] used[i-1] false){continue;}if (used[i] false){path.emplace_back(nums[i]);used[i] true;backTracing(nums, used, path, paths);path.pop_back();used[i] false;}}}vectorvectorint permuteUnique(vectorint nums) {sort(nums.begin(), nums.end());vectorint path;vectorvectorint paths;vectorbool used(nums.size(), false);backTracing(nums, used, path, paths);return paths;}
};
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/89054.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!