摘要:當(dāng)前的值如果已經(jīng)被使用過(guò),則繼續(xù)判斷下一個(gè)數(shù)值。則當(dāng)?shù)谝粋€(gè)被添加進(jìn)結(jié)果集時(shí),可以繼續(xù)使用第二個(gè)作為元素添加進(jìn)結(jié)果集從而生成。假設(shè)將表示為那么結(jié)果集中會(huì)確保永遠(yuǎn)在數(shù)值的前面,從而避免了和的重復(fù)情況出現(xiàn)。
題目要求
Given a collection of numbers that might contain duplicates, return all possible unique permutations. For example, [1,1,2] have the following unique permutations: [ [1,1,2], [1,2,1], [2,1,1] ]
對(duì)于其基礎(chǔ)題PermutationsI請(qǐng)參考我的另一篇博客
這里添加的難度在于,排列組合的數(shù)字中可能存在重復(fù)。這就需要想方法,將結(jié)果集中重復(fù)的結(jié)果刪去。而這里,我參考了另一名答題者的答案,在試圖將數(shù)字添入結(jié)果集中時(shí),就判斷會(huì)不會(huì)產(chǎn)生重復(fù)的結(jié)果,從而使避免重復(fù)。
這里采用了遞歸的思路。避免重復(fù)的核心思路在于,使用一個(gè)boolean數(shù)組來(lái)代表當(dāng)前的數(shù)值是否已經(jīng)被使用過(guò)。當(dāng)前的值如果已經(jīng)被使用過(guò),則繼續(xù)判斷下一個(gè)數(shù)值。如果當(dāng)前的值為重復(fù)值,則只要前面的值沒(méi)有被使用過(guò),則當(dāng)前值就不可以被使用。這樣確保了只有第一個(gè)出現(xiàn)的重復(fù)值可以算進(jìn)結(jié)果集,后序重復(fù)的情況不會(huì)被添加進(jìn)結(jié)果集。
例如,假設(shè)輸入的數(shù)組為[1,1,2]。則當(dāng)?shù)谝粋€(gè)1被添加進(jìn)結(jié)果集時(shí),可以繼續(xù)使用第二個(gè)1作為元素添加進(jìn)結(jié)果集從而生成112。同理,當(dāng)試圖將第二個(gè)1作為第一個(gè)元素添加進(jìn)結(jié)果集時(shí),只要第一個(gè)1還沒(méi)有被使用過(guò),則不可以使用第二個(gè)1。因此,112不會(huì)被重復(fù)的添加進(jìn)結(jié)果集。
其實(shí),這個(gè)算法保證了所有重復(fù)的數(shù)字在結(jié)果集中的順序和在原輸入數(shù)組中的順序是相同的。假設(shè)將[1,1,2]表示為[1,1#,2],那么結(jié)果集中會(huì)確保1永遠(yuǎn)在數(shù)值1#的前面,從而避免了11#2和1#12的重復(fù)情況出現(xiàn)。
代碼如下:
public List> permuteUnique(int[] nums) { List
> res = new ArrayList
>(); if(nums==null || nums.length==0) return res; boolean[] used = new boolean[nums.length]; List
list = new ArrayList (); //排序有利于判斷重復(fù)值 Arrays.sort(nums); //深度優(yōu)先算法 dfs(nums, used, list, res); return res; } public void dfs(int[] nums, boolean[] used, List list, List > res){ //如果結(jié)果長(zhǎng)度和輸入長(zhǎng)度相等,則添加進(jìn)結(jié)果集 if(list.size()==nums.length){ res.add(new ArrayList
(list)); return; } for(int i=0;i 0 &&nums[i-1]==nums[i] && !used[i-1]) continue; used[i]=true; list.add(nums[i]); dfs(nums,used,list,res); used[i]=false; list.remove(list.size()-1); } }
想要了解更多開(kāi)發(fā)技術(shù),面試教程以及互聯(lián)網(wǎng)公司內(nèi)推,歡迎關(guān)注我的微信公眾號(hào)!將會(huì)不定期的發(fā)放福利哦~
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/67086.html
摘要:題目詳情題目要求輸入一個(gè)可能會(huì)有重復(fù)數(shù)字的數(shù)組,要求我們輸出可能組成的全排列無(wú)重復(fù)排列。可以用來(lái)實(shí)現(xiàn),但這種實(shí)現(xiàn)方式復(fù)雜度高。另外一種實(shí)現(xiàn)思路是,新聲明一個(gè)數(shù)組來(lái)存儲(chǔ)中元素的使用狀況。以這個(gè)數(shù)組為例。 題目詳情 Given a collection of numbers that might contain duplicates, return all possible unique ...
摘要:前言從開(kāi)始寫(xiě)相關(guān)的博客到現(xiàn)在也蠻多篇了。而且當(dāng)時(shí)也沒(méi)有按順序?qū)懍F(xiàn)在翻起來(lái)覺(jué)得蠻亂的。可能大家看著也非常不方便。所以在這里做個(gè)索引嘻嘻。順序整理更新更新更新更新更新更新更新更新更新更新更新更新更新更新更新更新 前言 從開(kāi)始寫(xiě)leetcode相關(guān)的博客到現(xiàn)在也蠻多篇了。而且當(dāng)時(shí)也沒(méi)有按順序?qū)憽F(xiàn)在翻起來(lái)覺(jué)得蠻亂的。可能大家看著也非常不方便。所以在這里做個(gè)索引嘻嘻。 順序整理 1~50 1...
Permutations I Problem Given a list of numbers, return all possible permutations. Example For nums = [1,2,3], the permutations are: [ [1,2,3], [1,3,2], [2,1,3], [2,3,1], [3,1,2], [3,2,1]] Challe...
摘要:每一輪搜索選擇一個(gè)數(shù)加入列表中,同時(shí)我們還要維護(hù)一個(gè)全局的布爾數(shù)組,來(lái)標(biāo)記哪些元素已經(jīng)被加入列表了,這樣在下一輪搜索中要跳過(guò)這些元素。 Permutations I Given a collection of numbers, return all possible permutations. For example, [1,2,3] have the following permu...
摘要:解題思路這道題是要將排列按字典序排列,然后求出下一個(gè)排列,一種辦法是我們先求出所有的排序情況,但是題目規(guī)定不能占有額外空間。每次求出一個(gè)數(shù)字后,要及時(shí)的把它從中刪除掉。采用來(lái)構(gòu)造結(jié)果序列。 PermutationsGiven a collection of distinct numbers, return all possible permutations. For example, ...
閱讀 1785·2021-11-15 11:37
閱讀 3064·2021-11-04 16:05
閱讀 1925·2021-10-27 14:18
閱讀 2756·2021-08-12 13:30
閱讀 2500·2019-08-29 14:18
閱讀 2086·2019-08-29 13:07
閱讀 2025·2019-08-27 10:54
閱讀 2727·2019-08-26 12:15