我试图通过只复制集合中的数组项而不复制整个集合来获得数组的排列
我找到了一个解决方案,但我应该手动为循环编码,就像一个集合中的项目数量一样多如何将此解决方案推广到集合中的项数,并根据集合中的项数来生成多个嵌套的
public static List<List<float>> Permute( float [] array, int numberOfItemsInCollection=3)
{
var collections = new List<List<float>>();
for (int i = 0; i < array.Length; i++)
for (int j = i; j <array.Length; j++)
for (int k = j; k < array.Length; k++)
collections.Add(new List<float> { array[i], array[j], array[k]});
return collections;
}
即,如果我有一个数组{1,2,3,4},结果就像下面的
1,1,1
1,1,2
1,1,3
1,1,4
1,2,2
1,2,3
1,2,4
1,3,3
1,3,4
1,4,4
2,2,2
2,2,3
2,2,4
2,3,3
2,3,4
2,4,4
3,3,3
3,3,4
4,4,4
非常感谢你的第一个答案,效果很好。我试图将sum添加到集合中,并按如下方式编辑代码,但发生了堆叠错误
public static void Permute(int[] prices, int[] volumes, int numberOfItemsInCollection, int k, List<int> curr, int sumPrice, int sumVolume,List<List<int>> ans)
{
if (curr.Count == numberOfItemsInCollection)
{
curr.Add(sumPrice);
curr.Add(sumVolume);
ans.Add(new List<int>(curr));
sumPrice = 0;
sumVolume = 0;
return;
}
for (int i = k; i < prices.Length; i++)
{
curr.Add(prices[i]);
sumPrice+=prices[i];
sumPrice+=volumes[i];
Permute(prices, volumes, numberOfItemsInCollection, i, curr,sumPrice, sumVolume, ans);
curr.RemoveAt(curr.Count - 1);
}
}
public static List<List<int>> Permute(int[] prices, int[] volumes, int numberOfItemsInCollection)
{
List<List<int>> ans = new List<List<int>>();
Permute(prices, volumes, numberOfItemsInCollection, 0, new List<int>(),0,0, ans);
return ans;
}
用java语言编写代码。你可以很容易地将其转换为你想要的语言。
public static void Permute(int [] array, int numberOfItemsInCollection,int k,List<Integer> curr,List<List<Integer>> ans)
{
if(curr.size()==numberOfItemsInCollection) {
ans.add(new ArrayList<>(curr));
return ;
}
for (int i = k; i < array.length; i++) {
curr.add(array[i]);
Permute(array, numberOfItemsInCollection, i, curr, ans);
curr.remove(curr.size() - 1);
}
}
public static List<List<Integer>> Permute(int [] array, int numberOfItemsInCollection){
List<List<Integer>> ans=new ArrayList<>();
Permute(array,numberOfItemsInCollection,0, new ArrayList<>(), ans);
return ans;
}