java组_java – 一组中对的所有组合

如果我理解正确,这个问题的递归解决方案应该相当简单:

>从集合中删除第一个元素A.

>对于每个剩余的元素B:

>从集合中删除元素B.

>创建一对(A,B)并将其存储为当前解决方案的一部分

>使用剩余的集进行递归.这将为当前解决方案添加更多对.如果集合中没有剩余元素,则将当前解决方案存储为最终解决方案之一.

>将元素B添加到集合中

>将元素A添加到集合中

添加和删​​除元素的部分实际上并不包含在此示例实现中,因为它为迭代和递归调用创建了一个列表和一个新集合,但这个想法应该是清楚的.

import java.util.ArrayList;

import java.util.Arrays;

import java.util.LinkedHashSet;

import java.util.List;

import java.util.Set;

public class AllPairs

{

public static void main(String[] args)

{

Set set = new LinkedHashSet(

Arrays.asList(1,2,3,4,5,6));

ArrayList>> results =

new ArrayList>>();

compute(set, new ArrayList>(), results);

for (List> result : results)

{

System.out.println(result);

}

}

private static void compute(Set set,

List> currentResults,

List>> results)

{

if (set.size() < 2)

{

results.add(new ArrayList>(currentResults));

return;

}

List list = new ArrayList(set);

Integer first = list.remove(0);

for (int i=0; i

{

Integer second = list.get(i);

Set nextSet = new LinkedHashSet(list);

nextSet.remove(second);

List pair = Arrays.asList(first, second);

currentResults.add(pair);

compute(nextSet, currentResults, results);

currentResults.remove(pair);

}

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值