我有一个[]的整数1 <= N <= 100,我怎么能得到这个数组的排列? - >数组可能包含重复项,因此产生的排列集可能重复,因此需要获取所有非重复的排列.
有没有更简单的方法?
例如:123会给
231
321
312
132
213
123
Run Code Online (Sandbox Code Playgroud)
同样的112计划会给
121
211
211
121
112
112
Run Code Online (Sandbox Code Playgroud)
因此,对于n组元素,排列将是n!随着元素的重复,将减少,我问我怎么能删除那些重复集.(重复的置换集合arr [])
如果首先对词素进行词法排序是可以接受的,那么你就可以进行词汇排列.包括为int数组执行的算法,可以轻松修改为字符串.
public static boolean permuteLexically(int[] data) {
int k = data.length - 2;
while (data[k] >= data[k + 1]) {
k--;
if (k < 0) {
return false;
}
}
int l = data.length - 1;
while (data[k] >= data[l]) {
l--;
}
swap(data, k, l);
int length = data.length - (k + 1);
for (int i = 0; i < length / 2; i++) {
swap(data, k + 1 + i, data.length - i - 1);
}
return true;
}
Run Code Online (Sandbox Code Playgroud)
如何使用它的示例
public static void main(String[] args) {
int[] data = { 1,2,3 };
do {
System.err.println(Arrays.toString(data));
} while(Util.permuteLexically(data));
}
Run Code Online (Sandbox Code Playgroud)
你可以用[1,2,3]来使用它
[1, 2, 3]
[1, 3, 2]
[2, 1, 3]
[2, 3, 1]
[3, 1, 2]
[3, 2, 1]
Run Code Online (Sandbox Code Playgroud)
用[1,1,3]你得到
[1, 1, 3]
[1, 3, 1]
[3, 1, 1]
Run Code Online (Sandbox Code Playgroud)
这就是我想的那个问题.
由于该方法以字典顺序重新调整"下一个"排列,因此对元素进行排序是很重要的.从[3,2,1]开始,您不再获得更多排列(与上面的示例相比).