第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問(wèn)題,去搜搜看,總會(huì)有你想問(wèn)的

算法 集合的所有子集 全排列

算法 集合的所有子集 全排列

有只小跳蛙 2019-04-19 16:29:29
{1,2,3}的所有排列組合方式{{1},{2},{3}}{{1},{2,3}}{{1,2},{3}}{{1,3},{2}}{{123}}請(qǐng)大家給個(gè)想法或者算法實(shí)現(xiàn)
查看完整描述

2 回答

?
慕村9548890

TA貢獻(xiàn)1884條經(jīng)驗(yàn) 獲得超4個(gè)贊

publicList>>allSubsetPermutation(int[]nums){
if(nums==null||nums.length==0)
returnnull;
Queue>>q=newLinkedList<>();
q.add(newLinkedList<>());
for(intn:nums){
intsize=q.size();
while(size-->0){
List>list=q.poll();
for(inti=0;iList>l=deepClone(list);
l.get(i).add(n);
q.offer(l);
}
list.add(newLinkedList<>(Arrays.asList(n)));
q.offer(list);
}
}
returnnewLinkedList<>(q);
}
privateList>deepClone(List>list){
List>l=newLinkedList<>();
for(Listli:list)
l.add(newLinkedList<>(li));
returnl;
}
@Test
publicvoidtest(){
List>>l=null;
l=allSubsetPermutation(newint[]{1});
l=allSubsetPermutation(newint[]{1,2});
l=allSubsetPermutation(newint[]{1,2,3});
l=allSubsetPermutation(newint[]{1,2,3,4});
return;
}
                            
查看完整回答
反對(duì) 回復(fù) 2019-04-19
?
慕勒3428872

TA貢獻(xiàn)1848條經(jīng)驗(yàn) 獲得超6個(gè)贊

這個(gè)我想到高中的排列組合,用的是隔板法(不太記得是不是叫這個(gè))。比如,隔板是說(shuō)在1|2|3|4數(shù)字中間放的分隔板。分成一個(gè)集合,不用隔板分成兩個(gè)集合,放一個(gè)隔板,共C(n-1,1),比如{1|234}{12|34}{123|4}分成k個(gè)集合,放k-1個(gè)隔板,共C(n-1,k-1)種。
然后想如何實(shí)現(xiàn)隔板,給隔板編號(hào)1,2,...,n-1于是每次放k個(gè)隔板意味著從n-1個(gè)數(shù)中取出k個(gè)數(shù)字,就是組合數(shù),可以用回溯遍歷出來(lái)
seq[]放k的數(shù)字
seq[]=-1表示這個(gè)位置沒(méi)有數(shù)字
DFS(index){
if(index==k){print();return;}
for(inti=1;i<=n-1;++i){
if(seq[index]==-1){
seq[index]=i;//
DFS(index+1)
seq[index]=-1
}
}
}
print(){
intindex=0;
for(inti=1;i<=n;++i){
printf(i);
if(i==seq[index]){index++;print(|)}
}
}
DFS(1)
講的好,如果不存儲(chǔ)全部的子集的話,每次維護(hù)/保存當(dāng)前i的子集的序列,每次加一個(gè)i+1時(shí),只需要輸出i,和將i加到當(dāng)前序列里面就可以了。
DFS(intnum){
print({num});
for(inti=0;iseq[i].add(num);//把num加入當(dāng)前隊(duì)列
print({);//便于顯示觀看
for(intj=0;jprinf(seq[i][j]);
prinf(});//便于顯示觀看
}
DFS(num+1);
}
如果不存儲(chǔ)全部的子集的話,只需要復(fù)制seq,再添加num到其中一個(gè)seq中去即可,再加一個(gè){num}。
咦?其實(shí)這個(gè)也可以直接一個(gè)循環(huán),不用DFS還要浪費(fèi)棧,因?yàn)閚um是從1到n沒(méi)有變化的呀!
for(intnum=1;num<=n;++num)
{
print({num});
for(inti=0;iseq[i].add(num);//把num加入當(dāng)前隊(duì)列
print({);//便于顯示觀看
for(intj=0;jprinf(seq[i][j]);
prinf(});//便于顯示觀看
}
}
                            
查看完整回答
反對(duì) 回復(fù) 2019-04-19
  • 2 回答
  • 0 關(guān)注
  • 774 瀏覽
慕課專(zhuān)欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢(xún)優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)