Leetcode78 — Subconjunto

Dado un conjunto de ningún elemento de repetición matriz de enteros  los nums , que devuelve una matriz de todos los subconjuntos posibles (Ajuste de Potencia).

Nota: El conjunto de soluciones no puede contener subconjuntos duplicados.

Ejemplos:

Entrada: nums = [1,2,3]
Salida:
[
  [3],
  [1],
  [2],
  [1,2,3],
  [1,3],
  [2,3],
  [1, 2],
  []
]

 Método 1: retroceso

El método de retroceso es un algoritmo de búsqueda, el propósito es encontrar todas las condiciones que cumplen con las condiciones, y su característica es que regresará, haciendo posible obtener todas las condiciones.

En muchos problemas recursivos, el método que tomamos es agotar todas las posibilidades para encontrar una solución legal. Sin embargo, en algunos casos, cuando se recurre a una determinada capa, de acuerdo con las condiciones de juicio establecidas , se puede juzgar que esta solución es ilegal. En este caso, ya no necesitamos realizar una recursión profunda, lo que puede mejorar la eficiencia del algoritmo. Este tipo de algoritmo se denomina " método de retroceso ", y el conjunto de condiciones de juicio se denomina " función de poda ".

Se puede dividir aproximadamente en tales casos, y buscar en orden de acuerdo con la línea roja:

class Solution {
public:
    vector<vector<int>> subsets(vector<int>& nums) {
        vector<vector<int>> out;//保存最终结果
        vector<int>curout;//存储子集
        generate(nums, out, curout, 0); 
        return out;
    }
    

    void generate(vector<int> nums, vector<vector<int>> &out, vector<int>&curout, int k)
    {
	    if (k >= nums.size())//当循环到底时推出,k可表示循环深度
	    {
		    return;
	    }
	    curout.push_back(nums[k]);
        out.push_back(curout);
	    generate(nums, out, curout, k + 1);//对存在的子集
	    curout.pop_back();//向后退一步
	    generate(nums, out, curout, k + 1);
    }
};

Al observar el comentario del tema, un tipo grande presenta el método de la aritmética de bits y piensa que es mágico.

De hecho, al buscar el subconjunto de [1,2,3] puede considerar cada número, cada número tiene dos estados, en el subconjunto o no en el subconjunto. Use Y bit a bit para encontrar este bit.

	class Solution {
	public:
		vector<vector<int>> subsets(vector<int>& nums) {
			vector<vector<int>> out;//保存最终结果
            vector<vector<int>> out;
	        int n = nums.size();
	        int a = 1 << n;//子集的数量
	        for (int i = 0; i < a; i++)
	        {
		        vector<int> item;
		        for (int j = 0; j < n; j++)
		        {
			        if (i&(1 << j))//&位与运算,只有j位和i的1一致时为真
			        {
				        item.push_back(nums[j]);
			        }
		        }
		    out.push_back(item);
	        }
	        return out;
    }
};

 

Publicado 17 artículos originales · me gustó 0 · vistas 3228

Supongo que te gusta

Origin blog.csdn.net/qq_31874075/article/details/103446390
Recomendado
Clasificación