Maison > Java > javaDidacticiel > Ensemble de puissance

Ensemble de puissance

DDD
Libérer: 2024-09-19 06:19:33
original
546 Les gens l'ont consulté

Power set

Problème

Approche de retour en arrière :
TC:(2^n) c'est-à-dire une complexité temporelle exponentielle (puisque nous avons deux choix à chaque appel récursif, c'est-à-dire soit considérer la valeur à « index » ou non, ce qui conduit à 2 résultats possibles, cela se produira n fois)
SC:(2^n)*(n), n pour temp ArrayList<>() et 2^n pour ArrayList principal<>();

class Solution {
    public List<List<Integer>> subsets(int[] nums) {
        List<List<Integer>> list = new ArrayList<>();
        powerSet(nums,0,list,new ArrayList<Integer>());
        return list;
    }
    public void powerSet(int [] nums, int index , List<List<Integer>> list, List<Integer> l){
        //base case
        if(index ==nums.length){
            list.add(new ArrayList<>(l));
            return;
        }
        //take
        l.add(nums[index]); //consider the value at 'index'
        powerSet(nums,index+1,list,l);
        //dont take;
        l.remove(l.size()-1);// don't consider the value at 'index'
        powerSet(nums,index+1,list,l);
    }
}
Copier après la connexion

Utilisation de la manipulation de bits :
TC : O(2^n)*n
SC : O(2^n)*n, (2^n pour la liste principale et n pour les listes de sous-ensembles, eh bien, tous les sous-ensembles ne seront pas de taille n mais nous pouvons quand même supposer que c'est le cas)

pré-requis : vérifier si le bit est activé ou non (référez-vous à la page Trucs et astuces sur la manipulation des bits pour plus de détails)
Intuition :
Si tout le non. les sous-ensembles sont représentés sous forme de valeurs binaires,
par exemple : si n = 3, c'est-à-dire un tableau contenant 3 valeurs.
il y aura 2^n = 8 sous-ensembles
8 sous-ensembles peuvent également être représentés comme

index 2 index 1 index 0 subset number
0 0 0 0
0 0 1 1
0 1 0 2
0 1 1 3
1 0 0 4
1 0 1 5
1 1 0 6
1 1 1 7

Nous prendrons en considération le fait que si la valeur du bit est 1, alors cette valeur d'index dans nums[] doit être prise en compte pour former le sous-ensemble.
De cette façon nous pourrons créer tous les sous-ensembles

class Solution {
    public List<List<Integer>> subsets(int[] nums) {
        List<List<Integer>> list = new ArrayList<>();
        int n = nums.length;
        int noOfSubset = 1<<n; // this is nothing but 2^n, i.e if there are n elements in the array, they will form 2^n subsets

        for(int num = 0;num<noOfSubset;num++){ /// all possible subsets numbers
            List<Integer> l = new ArrayList<>();
            for(int i =0;i<n;i++){// for the given subset number find which index value to pick 
                if((num & (1<<i))!=0) l.add(nums[i]); 
            }
            list.add(l);
        }
        return list;
    }
}
Copier après la connexion

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal