• 【无标题】


    资料:

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

    1. set遍历:

    1. // 迭代器遍历 set
    2. for (auto iter = s.begin(); iter != s.end(); ++iter)
    3. {
    4. cout << *iter << " ";
    5. }
    6. // for-each 循环遍历 set
    7. for (int x : s)
    8. {
    9. cout << x << " ";
    10. }
    11. // C++11提供了auto关键字
    12. for (auto i : s)
    13. {
    14. cout << i << " ";
    15. }

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

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

    第一种最简单:

    1. vector<int> vec = {...};
    2. set<int>s(vec.begin(), vec.end());
    3. vec.assign(s.begin(), s.end());

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

    3. vector的初始化

    1. // 1.逐个push_back
    2. // 2.指定大小并初始化所有值
    3. vector<int> vect(n, 10); // Create a vector of size n with all values as 10
    4. // 3.像数组一样初始化
    5. vector<int> vect{ 10, 20, 30 };
    6. // 4.使用数组初始化
    7. int arr[] = { 10, 20, 30 };
    8. int n = sizeof(arr) / sizeof(arr[0]);
    9. vector<int> vect(arr, arr + n);
    10. // 5.使用另一个vector初始化
    11. vector<int> vect1{ 10, 20, 30 };
    12. vector<int> vect2(vect1.begin(), vect1.end());

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

    自己写的:

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

    1. class Solution {
    2. public:
    3. /**
    4. * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
    5. *
    6. *
    7. * @param num int整型vector
    8. * @return int整型vector>
    9. */
    10. vectorint> > ans;
    11. vector<int> flag;
    12. void dfs(vector<int>num, vector<int>ans_single){
    13. if(ans_single.size() == num.size()){
    14. ans.push_back(ans_single);
    15. return;
    16. }
    17. unordered_map<int, int> hash;
    18. for(int i = 0; i < num.size(); i ++){
    19. // 没遍历过 && 不是重复的
    20. if(flag[i] != 1 && hash.find(num[i]) == hash.end()) { // 不是find(hash.begin(), hash.end(), num[i])
    21. hash[num[i]] = 1;
    22. // 遍历
    23. flag[i] = 1;
    24. ans_single.push_back(num[i]);
    25. dfs(num, ans_single);
    26. ans_single.pop_back();
    27. flag[i] = 0;
    28. }
    29. }
    30. }
    31. vectorint> > permuteUnique(vector<int>& num) {
    32. // write code here
    33. for(int i = 0; i < num.size(); i++)
    34. flag.push_back(0);
    35. vector<int> ans_single;
    36. dfs(num, ans_single);
    37. sort(ans.begin(), ans.end());
    38. return ans;
    39. }
    40. };

    模板的:

    框架与我的一样。

    不同之处:我采用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]是纵向的。我完全搞混了概念。
    1. class Solution {
    2. public:
    3. /**
    4. * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
    5. *
    6. *
    7. * @param num int整型vector
    8. * @return int整型vector>
    9. */
    10. vectorint> > ans;
    11. vector<int> flag;
    12. void dfs(vector<int>num, vector<int>ans_single){
    13. if(ans_single.size() == num.size()){
    14. ans.push_back(ans_single);
    15. return;
    16. }
    17. for(int i = 0; i < num.size(); i ++){
    18. // 没遍历过 && 不是重复的
    19. if(flag[i])
    20. continue;
    21. if(i != 0 && num[i-1] == num[i] && flag[i-1] == 0)
    22. continue; //如果判断条件太长,可以采用continue来跳过循环。
    23. // 遍历
    24. flag[i] = 1;
    25. ans_single.push_back(num[i]);
    26. dfs(num, ans_single);
    27. ans_single.pop_back();
    28. flag[i] = 0;
    29. }
    30. }
    31. vectorint> > permuteUnique(vector<int>& num) {
    32. // write code here
    33. for(int i = 0; i < num.size(); i++)
    34. flag.push_back(0);
    35. vector<int> ans_single;
    36. sort(num.begin(), num.end()); //模板的方法需要之前就排好序
    37. dfs(num, ans_single);
    38. return ans;
    39. }
    40. };

  • 相关阅读:
    表白,七夕,给女朋友,3D相册,例子拖尾,女朋友生日,女生生日都可以哦
    阿里巴巴云生态 9 大开源项目重磅发布
    sql打卡记录四 集合运算
    simpleitk 读数据 图像 dicom nii 处理数据
    Datax的同步调研
    Error: error:0308010C:digital envelope routines::unsupported
    python-0004-django站点
    pointnet点云分类,matlab,程序可用,修改一个参数
    Java入门 面向对象(接口) (第二十一天)
    Allegro Design Entry HDL(OrCAD Capture HDL)元器件管理菜单详细介绍
  • 原文地址:https://blog.csdn.net/weixin_47173826/article/details/134452134