(97) 77. Combinación (leetcode)

题目链接:
https://leetcode-cn.com/problems/combinations/
难度:中等
77. 组合
	给定两个整数 n 和 k,返回 1 ... n 中所有可能的 k 个数的组合。
示例:
	输入: n = 4, k = 2
	输出:
	[
	  [2,4],
	  [3,4],
	  [2,3],
	  [1,2],
	  [1,3],
	  [1,4],
	]

No es difícil
ni recursivamente conveniente. . .

class Solution {
    
    
public:
    vector<vector<int>> ans;
    vector<int> curvec;
    vector<vector<int>> combine(int n, int k) {
    
    
        dfs(1,n,k);
        return ans;
    }

    void dfs(int cursize,int n,int k){
    
    
        if(curvec.size()==k){
    
    
            ans.push_back(curvec);
            return;
        }
        if(curvec.size()+n-cursize+1<k){
    
    
            return;
        }
        curvec.push_back(cursize);
        dfs(cursize+1,n,k);
        curvec.pop_back();
        dfs(cursize+1,n,k);
    }
};

La recursividad es realmente simple y otro método es realmente inesperado. . . Registrar explicaciones de coordenadas que
apenas entiendo estimar la próxima vez que lo olvidé

	原序列中被选中的数	对应的二进制数		方案
	4    3   [2] [1]		0011		    2, 1
	4   [3]   2  [1]		0101	    	3, 1
	4   [3]  [2]  1		    0110		    3, 2
	[4]  3    2  [1]		1001	     	4, 1	
	[4]  3   [2]  1		    1010		    4, 2
	[4] [3]   2   1		    1100		    4, 3	

El final es 1: como ... 0 {1 … 1 **} **: intercambia 0 1 (hay una cadena que contiene solo 1 al final, intercambia el primer 1 de la cadena con el 0 antes del 1), el
final es 0: como ... 0 {1 … 1} {0… 0}: intercambie 0 a 1 y deje el 1 restante al final del método:… 10 {0… 0} {… 1} (el final es 0, debe haber una cadena con solo 0, antes de la cadena 0 También hay una cadena de 1, intercambie la primera posición de 1 con el 0 anterior y luego coloque el 1 restante al final)
{1 ... 1}: cadena que solo incluye 1- {0 ... 0}: solo Una cadena que incluye 1 El
siguiente código evita inteligentemente el uso de memoria adicional para guardar el número seleccionado actualmente
(0 en el binario significa no seleccionado, 1 significa seleccionar el código correspondiente. 1 significa curvac [i] + 1 == curvac [i + 1], y 0 significa curvac [i] +1! = curvac [i + 1])

class Solution {
    
    
public:
    vector<int> curvec;
    vector<vector<int>> ans;

    vector<vector<int>> combine(int n, int k) {
    
    
        for (int i=1;i<=k;++i) {
    
    
            curvec.push_back(i);
        }
        // 这里必须是  n+1
        curvec.push_back(n+1);
        int i=0;
        while(i<k){
    
    
            ans.emplace_back(curvec.begin(),curvec.begin()+k);
            i=0;
            while(i<k&&curvec[i]+1==curvec[i+1]){
    
    
                curvec[i]=i+1;
                i++;
            }
            curvec[i]++;
        }
        return ans;
    }
};

Supongo que te gusta

Origin blog.csdn.net/li_qw_er/article/details/108459628
Recomendado
Clasificación