当前位置:网站首页>Leetcode 47. Full arrangement II
Leetcode 47. Full arrangement II
2021-10-14 03:37:32 【Structure et algorithme des données】
Jusqu'à présent, j'ai écrit 600Problème d'algorithme multicanal,Certains d'entre eux ont été triéspdfDocumentation,Pour l'instantEn tout.1000Plusieurs pages(Et ça va augmenter),Téléchargement gratuit
Télécharger le lien:https://pan.baidu.com/s/1hjwK0ZeRxYGB8lIkbKuQgQ
Code d'extraction:6666
C'est la même chose qu'avant.593,Le problème classique de l'algorithme de rétrosuivi-Disposition complètePresque., Mais il y a Dupliquer les chiffres ,Mais...593 La question n'est pas répétée . S'il y a des chiffres en double, il y aura certainement des combinaisons en double , Donc cette question doit filtrer les combinaisons répétées . Que se passe - t - il si vous ne Filtrez pas , Prenons l'exemple de l'exemple 1 et regardons le graphique ( Pour distinguer le premier 1Et le deuxième1, J'ai utilisé des marques noires et rouges ).
Comment filtrer les nombres dupliqués , Une façon est de trouver tous les résultats combinés , Puis filtrer les combinaisons répétées dans ce résultat . C'est mieux si la combinaison est une chaîne , Mais voici un tableau , Tous les tableaux en deux sont trop complexes , De cette façon, nous n'envisageons pas .
En plus de l'une des solutions décrites ci - dessus, il y a une autre façon dont nous disons souvent Couper, Comment couper ? Parce que pour filtrer les duplicatas , Seuls les chiffres dupliqués donnent des résultats dupliqués . Donc la première étape est de faire le tableau Trier, Le même nombre après le tri doit être à côté .
Quand vous traversez le nombre actuel , Si le nombre actuel dans le tableau est le même que le nombre précédent , Et le chiffre précédent n'a pas été utilisé , On va sauter la branche actuelle , C'est - à - dire couper la branche actuelle .Comme le montre la figure ci - dessous
Les codes sont les suivants:
public List<List<Integer>> permuteUnique(int[] nums) {
//Trier d'abord le tableau, Ce faisant, les mêmes valeurs doivent être contiguës dans le tableau ,
// Filtrer facilement les résultats en double
Arrays.sort(nums);
List<List<Integer>> res = new ArrayList<>();
//booleanTableau,used[i]Élément de représentationnums[i] A - t - on déjà visité
boolean[] used = new boolean[nums.length];
// Effectuer un algorithme de rétrosuivi
backtrack(nums, used, new ArrayList<>(), res);
return res;
}
public void backtrack(int[] nums, boolean[] used, List<Integer> tempList, List<List<Integer>> res) {
// Si tous les éléments du tableau sont utilisés , C'est comme arriver au noeud foliaire ,
// Nous ajoutons directement les éléments du chemin du noeud racine au noeud foliaire courant
//Au rassemblementresMoyenne
if (tempList.size() == nums.length) {
res.add(new ArrayList<>(tempList));
return;
}
// Traverser les éléments du tableau
for (int i = 0; i < nums.length; i++) {
// Si elle a déjà été utilisée ,Sauter directement
if (used[i])
continue;
//Attention!, Ici, il faut couper les combinaisons répétées
// Si l'élément courant est le même que l'élément précédent , Et le précédent n'a pas été utilisé , On saute aussi
if (i > 0 && nums[i - 1] == nums[i] && !used[i - 1])
continue;
// Sinon, nous utiliserons l'élément courant , Marque - le comme utilisé
used[i] = true;
// Mettez l'élément courant nums[i]Ajouter àtempListMoyenne
tempList.add(nums[i]);
//Récursion,Similaire ànTraversée de l'arbre de fourche,Continuez à descendre.
backtrack(nums, used, tempList, res);
// Quand la récursion est terminée, elle revient en arrière , Pour revenir en arrière et annuler le choix
used[i] = false;
tempList.remove(tempList.size() - 1);
}
}
En plus de la coupe dont il est question ci - dessus , Y a - t - il d'autres façons de couper ,En fait, il y a.C'est Quand vous traversez le nombre actuel , Si le nombre actuel est le même que le nombre précédent dans le tableau , Et le chiffre précédent a été utilisé , On va sauter la branche actuelle , C'est - à - dire couper la branche actuelle ( Contrairement à ce qui précède ).Comme le montre la figure ci - dessous
C'est ce dont nous parlions 590,L'algorithme de rétrosuivi résout le nombre de tableaux carrés Dernière mention dans , Les deux méthodes de coupe sont acceptables , L'un est de couper toute la branche , L'un d'eux est de couper des brindilles sous chaque brindille . Il est évident que la première coupe est plus efficace ,Voyons le Code.
public List<List<Integer>> permuteUnique(int[] nums) {
//Trier d'abord le tableau, Ce faisant, les mêmes valeurs doivent être contiguës dans le tableau ,
// Filtrer facilement les résultats en double
Arrays.sort(nums);
List<List<Integer>> res = new ArrayList<>();
//booleanTableau,used[i]Élément de représentationnums[i] A - t - on déjà visité
boolean[] used = new boolean[nums.length];
// Effectuer un algorithme de rétrosuivi
backtrack(nums, used, new ArrayList<>(), res);
return res;
}
public void backtrack(int[] nums, boolean[] used, List<Integer> tempList, List<List<Integer>> res) {
// Si tous les éléments du tableau sont utilisés , C'est comme arriver au noeud foliaire ,
// Nous ajoutons directement les éléments du chemin du noeud racine au noeud foliaire courant
//Au rassemblementresMoyenne
if (tempList.size() == nums.length) {
res.add(new ArrayList<>(tempList));
return;
}
// Traverser les éléments du tableau
for (int i = 0; i < nums.length; i++) {
// Si elle a déjà été utilisée ,Sauter directement
if (used[i])
continue;
//Attention!, Ici, il faut couper les combinaisons répétées
// Si l'élément courant est le même que l'élément précédent , Et le précédent a été utilisé , On saute aussi
if (i > 0 && nums[i - 1] == nums[i] && used[i - 1])
continue;
// Sinon, nous utiliserons l'élément courant , Marque - le comme utilisé
used[i] = true;
// Mettez l'élément courant nums[i]Ajouter àtempListMoyenne
tempList.add(nums[i]);
//Récursion,Similaire ànTraversée de l'arbre de fourche,Continuez à descendre.
backtrack(nums, used, tempList, res);
// Quand la récursion est terminée, elle revient en arrière , Pour revenir en arrière et annuler le choix
used[i] = false;
tempList.remove(tempList.size() - 1);
}
}
Les deux codes ci - dessus sont très similaires , La seule différence, c'est la ligne suivante ,Les autres sont les mêmes.
if (i > 0 && nums[i - 1] == nums[i] && used[i - 1])
Si on choisit , Nous choisirons certainement la première voie , Couper toute la grande branche .
版权声明
本文为[Structure et algorithme des données]所创,转载请带上原文链接,感谢
https://chowdera.com/2021/10/20211014032247502G.html
边栏推荐
- What stocks are there in financial stocks? When is the market better
- Can I buy the stocks that rose yesterday? Analyze from different situations
- Does the subscription of new shares of Beijing stock exchange need market value? What are the conditions
- What is the normal turnover rate? The answer is this
- Where is the current product with a yield of 4% of Huatong bank? How to calculate the interest withdrawn in advance?
- 2020-11-17
- Ruby‘s Adventure: 2D Beginner 一、 Unity入门
- 团队项目(一)(江山代有才人秃队)
- 好代码是管出来的——使用Jenkins搭建CI服务器
- No buffer space available tcp协议无法释放问题
猜你喜欢
-
解决:【安全警报】该站点安全证书的吊销信息不可用,是否继续?
-
脑机接口数据分析工具EEGLAB01---安装eeglab
-
Projet Open Source: Découvrez comment résoudre l'ensemble du processus de développement et de déploiement en 10 minutes!
-
HTV camera RTSP Video Streaming in High version Google Chrome Zero Delay play Effect Demonstration video, support for h.265 Format
-
Why do small banks have higher interest rates than large banks? Why don't everyone want to deposit in a small bank?
-
Why do small banks have high interest rates? Are small bank deposits risky?
-
How about Huatong bank Fu e deposit s (1 year)? Is the income high?
-
What are the stock group teacher brainwashing scams? Can the money lost be recovered?
-
How does wechat finance make money? How to make money on wechat?
-
Has Chao Zhaojin ever lost money? What are the advantages?
随机推荐
- Can Laobaigan liquor stock still rise? Is Laobaigan wine worth long-term investment
- How about rely on smart phone stock? Thousands of shares and thousands of comments of rely on smart electronics
- Is Fangda carbon stock worth holding for a long time? Future market trend of Fangda carbon stock
- Can green water source stocks be held for a long time? Why don't blue water stocks rise
- 腦機接口數據分析工具EEGLAB01---安裝eeglab
- 解决:【安全警報】該站點安全證書的吊銷信息不可用,是否繼續?
- Outil d'analyse des données de l'interface cerveau - ordinateur eeglab01 - - - installation eeglab
- Résolution: [alerte de sécurité] l'information sur la révocation du certificat de sécurité de ce site n'est pas disponible. Voulez - vous continuer?
- Aucun protocole TCP disponible dans l'espace tampon ne peut libérer le problème
- Le bon Code est géré - - construire un serveur ci en utilisant Jenkins
- Projet d'équipe (1) (équipe chauve de Jiangshan Dai Youcai)
- Ruby 's Adventure: 2D Beginner I, Unity Starting
- 17 novembre 2020
- Will Yonghe Zhikong stock rise? Analysis on stock value of Yonghe intelligent control
- Is Yingjia gongjiu stock suitable for long-term holding? Thousands of shares and thousands of comments on Yingjia gongjiu stock
- How about Xingwang Ruijie stock? STARNet Ruijie stock thousands of shares and thousands of comments
- Why did Tianqi lithium's stock soar recently? Thousands of shares and thousands of comments of Tianqi lithium
- Can Guangsheng nonferrous metals stock be held for a long time? Guangsheng Nonferrous Metals Co., Ltd
- How about Yunhai metal stock? Yunhai metal stock thousand shares thousand comments
- Why doesn't TCL technology stock rise? Reasons for TCL technology stocks falling every day
- What are the good low-cost stocks at present? Potential stocks below 3 yuan
- High quality low price stocks currently at the bottom (list of high quality low price stocks below RMB 10)
- 10 bull stocks with the largest increase in 2021 (demon stocks with a 10 fold increase this year)
- How about Huayin power stock? Will Huayin power stock rise
- Can Luzhou Laojiao stock still be bought? Luzhou Laojiao stock evaluation
- Is Datang Power Generation stock worth holding for a long time? Why does Datang Power Generation stock not rise for ten years
- What does BAIC Blue Valley do? Does BAIC Blue Valley stock have potential
- Principes de la plate - forme de développement Android, questions d'entrevue de développement Android
- Machine level representation of data
- No buffer space available tcp協議無法釋放問題
- 好代碼是管出來的——使用Jenkins搭建CI服務器
- Quelle est la différence entre l'analyse des données et l'exploration des données?
- HTB Jerry
- Detailed explanation of real-time cloud rendering technology - principle, application and advantages
- Original code complement
- Cs8406 cirrus logic up to 192 kHz frame rate
- Générateur de code général de luminosité HD CG
- LeetCode 47. 全排列 II
- 明明很努力的写博客,为啥没人看?试试这些方法和工具(建议收藏)
- 【微信小程序爬虫】表情包小程序图文视频教学,从零写起,保姆教程!!!