zoukankan      html  css  js  c++  java
  • 大雪菜 — LeetCode刷题打卡活动第三期——week2 DFS专题(部分代码)

    转自   https://www.bilibili.com/video/av34962180?t=1435&p=2

    77,给定两个整数 nk,返回 1 ... n 中所有可能的 k 个数的组合。

    vector<vector<int> >ans;
        vector<vector<int>> combine(int n, int k) {
            vector<int>way;
            dfs(way,1,n,k);
            return ans;
        }
        void dfs(vector<int>&way,int start,int n,int k)
        {
            if(k==0)
            {
                ans.push_back(way);
                return;
            }
    
            for(int i=start;i<=n;i++)
            {
                way.push_back(i);
                dfs(way,i+1,n,k-1);
                way.pop_back();
            }
        }

     一,组合和全排列

    1,组合:

    #define _CRT_SECURE_NO_WARNINGS
    #include<stdio.h>
    #include<stdlib.h>
    #include<vector>
    using namespace std;
    vector<int>way;
    int n,m;
    void show()
    {
        for (int i = 0; i < way.size(); i++)   //遍历
        {
            printf("%d ", way[i]);
        }puts("");
    }
    void dfs(int s, int k)  // 组合数
    {
        if (k == 0)
        {
            show();
            return;
        }
        for (int i = s; i <= n; i++)
        {
            way.push_back(i);
            dfs(i + 1, k - 1);
            way.pop_back();
        }
    }
    int main(void)
    {
        scanf("%d%d", &n,&m);
        dfs(m, n);
    
        system("pause");
        return 0;
    }

    这种方式不能用于全排列,因为这里得到的数始终是递增的,所以保证了他是按照字典序出现的,所以它不会出现 3 1 2 这种情况,而全排列会。

    2,全排列

    #define _CRT_SECURE_NO_WARNINGS
    #include<stdio.h>
    #include<stdlib.h>
    #include<vector>
    using namespace std;
    vector<int>way;
    int n;
    void show()
    {
        for (int i = 0; i < way.size(); i++)   //遍历
        {
            printf("%d ", way[i]);
        }puts("");
    }
    int vis[11];
    void DFS(int k)
    {
        if (k == 0)
        {
            show();
            return;
        }
        for (int i = 1; i <= n; i++)
        {
            if (vis[i] == 0)
            {
                vis[i] = 1;
                way.push_back(i);
                DFS(k - 1);
                vis[i] = 0;
                way.pop_back();
            }
        }
    }
    int main(void)
    {
        scanf("%d", &n);
        DFS(n);
    
        system("pause");
        return 0;
    }

    这个也不能用于组合数,因为他会重复求,如出现 123 132  213 之类的

    784,给定一个字符串S,通过将字符串S中的每个字母转变大小写,我们可以获得一个新的字符串。返回所有可能得到的字符串集合。

    class Solution {
    public:
        vector<string> ans;
        vector<string> letterCasePermutation(string S) {
            dfs(S,0);
    
            return ans;
        }
        void dfs(string S,int u)
        {
            if(u==S.size())
            {
                ans.push_back(S);
                return;
            }
            dfs(S,u+1);
    
            if(S[u]>='A')
            {
                S[u] ^=32;
                dfs(S , u + 1);
            }
        }
    };

    这一题 有一个挺秀的操作, S[u] ^=32    ,实现大小写的互换

    这两题我觉得还不错,愿能记住!!!

    ========== ========== ========= ======= ======== ====== ===== ==== == =

    求上进的人,不要总想着靠谁,人都是自私的,自己才是最靠得住的人。

  • 相关阅读:
    kill eclipse
    C语言之表达式运算整体提升
    查找函数对比:findall,search,match
    Linux backtrace()
    git本地协同
    git 撤销push到服务器的代码
    gtest
    C陷阱篇之enum默认长度
    程序员中文开发者手册
    C语言错题分析
  • 原文地址:https://www.cnblogs.com/asdfknjhu/p/12535636.html
Copyright © 2011-2022 走看看