【无标题】

资料:

想用set集合去重,但是发现set和原数组的长度不一样,导致下标不一样。最后还是用了hash。

  1. set遍历:
cpp 复制代码
// 迭代器遍历 set
    for (auto iter = s.begin(); iter != s.end(); ++iter)
    {
        cout << *iter << " ";
    }
// for-each 循环遍历 set
    for (int x : s)
    {
        cout << x << " ";
    }
// C++11提供了auto关键字
    for (auto i : s)
    {
        cout << i << " ";
    }

C++中set集合的遍历用法介绍_笔记大全_设计学院 (python100.com)

  1. 用set去重的方法:三种

第一种最简单:

cpp 复制代码
vector<int> vec = {...};
set<int>s(vec.begin(), vec.end());
vec.assign(s.begin(), s.end());

C++ 给vector去重的三种方法-CSDN博客

  1. vector的初始化
cpp 复制代码
// 1.逐个push_back

// 2.指定大小并初始化所有值
vector<int> vect(n, 10); // Create a vector of size n with all values as 10

// 3.像数组一样初始化
vector<int> vect{ 10, 20, 30 };

// 4.使用数组初始化
int arr[] = { 10, 20, 30 };
int n = sizeof(arr) / sizeof(arr[0]);
vector<int> vect(arr, arr + n);

// 5.使用另一个vector初始化
vector<int> vect1{ 10, 20, 30 };
vector<int> vect2(vect1.begin(), vect1.end());

vector的初始化(5种不同方式)_vector初始化-CSDN博客

自己写的:

多加了个hash判断是否重复。

cpp 复制代码
class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param num int整型vector 
     * @return int整型vector<vector<>>
     */
    vector<vector<int> > ans;
    vector<int> flag;
    void dfs(vector<int>num, vector<int>ans_single){
        if(ans_single.size() == num.size()){
            ans.push_back(ans_single);
            return;
        }
        
        unordered_map<int, int> hash;
        
        for(int i = 0; i < num.size(); i ++){
            // 没遍历过 && 不是重复的 
            if(flag[i] != 1 && hash.find(num[i]) == hash.end()) {    // 不是find(hash.begin(), hash.end(), num[i])
                    hash[num[i]] = 1;

                    // 遍历
                    flag[i] = 1; 
                    ans_single.push_back(num[i]);
                    dfs(num, ans_single);
                    ans_single.pop_back();
                    flag[i] = 0;
            }     
        }
        
    }

    vector<vector<int> > permuteUnique(vector<int>& num) {
        // write code here
        for(int i = 0; i < num.size(); i++)
            flag.push_back(0);
            
        vector<int> ans_single;

        dfs(num, ans_single);
        sort(ans.begin(), ans.end());

        return ans;
    }
};

模板的:

框架与我的一样。

不同之处:我采用hash判断。模板采用和前一个元素进行比较。

个人疑问,得到解决:

  • if(i != 0 && num[i-1] == num[i] && flag[i-1] == 0) 里,为什么不是flag[i-1] == 1?
    • 因为flag的标记是纵向的。当前的num[i]必须和前一个num[i-1]是相同的,并且前一个num[i-1]是之前层未被选择的,是与num[i]是属于同一层的。
  • 为什么直接continue就行,不需要vis[i]=1。
    • 重复的只需要横向选择一次。所以,第一次出现,与前一个是不同的;第二次及以后的每次出现,都与前一个相同。所以不需要进行任何操作。(模板的巧妙之处)
    • vis[i]是纵向的。我完全搞混了概念。
cpp 复制代码
class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param num int整型vector 
     * @return int整型vector<vector<>>
     */
    vector<vector<int> > ans;
    vector<int> flag;
    void dfs(vector<int>num, vector<int>ans_single){
        if(ans_single.size() == num.size()){
            ans.push_back(ans_single);
            return;
        }
        
        for(int i = 0; i < num.size(); i ++){
            // 没遍历过 && 不是重复的 
            if(flag[i])
                continue;
            if(i != 0 && num[i-1] == num[i] && flag[i-1] == 0) 
                continue;  //如果判断条件太长,可以采用continue来跳过循环。
     
            // 遍历
            flag[i] = 1; 
            ans_single.push_back(num[i]);
            dfs(num, ans_single);
            ans_single.pop_back();
            flag[i] = 0;

        }
        
    }

    vector<vector<int> > permuteUnique(vector<int>& num) {
        // write code here
        for(int i = 0; i < num.size(); i++)
            flag.push_back(0);
            
        vector<int> ans_single;
        sort(num.begin(), num.end()); //模板的方法需要之前就排好序
        dfs(num, ans_single);
  
        return ans;
    }
};
相关推荐
冠位观测者1 小时前
【Leetcode 热题 100】208. 实现 Trie (前缀树)
数据结构·算法·leetcode
小王爱吃月亮糖2 小时前
C++的23种设计模式
开发语言·c++·qt·算法·设计模式·ecmascript
IT猿手4 小时前
最新高性能多目标优化算法:多目标麋鹿优化算法(MOEHO)求解LRMOP1-LRMOP6及工程应用---盘式制动器设计,提供完整MATLAB代码
开发语言·算法·matlab·智能优化算法·多目标算法
InfiSight智睿视界5 小时前
AI 技术,让洗护行业焕然「衣」新
人工智能·算法
程序员一诺5 小时前
【机器学习】嘿马机器学习(算法篇)第11篇:决策树算法,学习目标【附代码文档】
人工智能·python·算法·机器学习
Evand J5 小时前
平方根无迹卡尔曼滤波(SR-UKF)算法,用于处理三维非线性状态估计问题
算法
taoyong0016 小时前
代码随想录算法训练营第十五天-二叉树-110.平衡二叉树
数据结构·算法
-芒果酱-6 小时前
k-Means聚类算法 HNUST【数据分析技术】(2025)
算法·kmeans·聚类
渣渣威的仿真秀6 小时前
Jensen-Shannon Divergence:定义、性质与应用
人工智能·算法·概率论
柒月的猫6 小时前
求和(2022蓝桥杯A组试题C)
c语言·算法·蓝桥杯