Java中找出数组的排列

时间:2020-02-23 14:35:29  来源:igfitidea点击:

在本教程中,我们将看到如何在Java中查找数组的所有排列。

问题1

给定的不同整数数组,打印阵列的所有排列。

例如:

阵列:[10,20,30]

排列有:

[10,20,30] [10,30,20] [20,10,30] [20,30,10] [30,10,20] [30,20,10] [30,20,10]

解决方案

我们可以在递归的帮助下解决问题。
解释递归很难,所以我创建了一个递归树来展示它。

这是代码相同。

package org.igi.theitroad;
 
import java.util.ArrayList;
import java.util.List;
 
public class PermutateArray {
 
	public static void main(String[] args) {
		PermutateArray pa=new PermutateArray();
		
		int[] arr= {10, 20, 30};
		
		List<List<Integer>> permute = pa.permute(arr);
		
		System.out.println("Permuations of array : [10, 20, 30] are:");
		System.out.println("=========================================");
		for(List<Integer> perm:permute)
		{
			System.out.println(perm);
		}
		
	}
	public List<List<Integer>> permute(int[] arr) {
		List<List<Integer>> list = new ArrayList<>();
		permuteHelper(list, new ArrayList<>(), arr);
		return list;
	}
 
	private void permuteHelper(List<List<Integer>> list, List<Integer> resultList, int [] arr){
 
		//Base case
		if(resultList.size() == arr.length){
			list.add(new ArrayList<>(resultList));
		} 
		else{
			for(int i = 0; i < arr.length; i++){ 
 
				if(resultList.contains(arr[i])) 
				{
					//If element already exists in the list then skip
					continue; 
				}
				//Choose element
				resultList.add(arr[i]);
				//Explore
				permuteHelper(list, resultList, arr);
				//Unchoose element
				resultList.remove(resultList.size() - 1);
			}
		}
	} 
 
}

运行上面的程序时,我们将得到以下输出:

Permuations of array : [10, 20, 30] are:
=========================================
[10, 20, 30]
[10, 30, 20]
[20, 10, 30]
[20, 30, 10]
[30, 10, 20]
[30, 20, 10]

我已经说明了递归如何使用下面的图表工作。

我们需要在新窗口中打开此图并缩放。

正如我们在阵列中有3个元素一样,这就是为什么我们为每个节点有3个分支。

问题2.

给定的整数数组(可以包含重复项),打印阵列的所有排列。

解决方案

我们可以使用递归来解决此问题,但需要处理重复项。
我们将对阵列进行排序,因此所有重复项都将被聚集。

package org.igi.theitroad;
 
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
 
public class PermuteArrayWithDuplicates {
 
	public static void main(String[] args) {
		PermuteArrayWithDuplicates pa=new PermuteArrayWithDuplicates();
		
		int[] arr= {10, 20, 10};
		
		List<List<Integer>> permute = pa.permute(arr);
		
		System.out.println("Permuations of array : [10, 20, 10] are:");
		System.out.println("=========================================");
		for(List<Integer> perm:permute)
		{
			System.out.println(perm);
		}
		
	}
	public List<List<Integer>> permute(int[] arr) {
		List<List<Integer>> list = new ArrayList<>();
		Arrays.sort(arr);
		permuteHelper(list, new ArrayList<>(), arr,new boolean[arr.length]);
		return list;
	}
 
	private void permuteHelper(List<List<Integer>> list, List<Integer> resultList, int [] arr, boolean [] used){
		
		//Base case
		if(resultList.size() == arr.length){
	        list.add(new ArrayList<>(resultList));
	    } else{
	        for(int i = 0; i < arr.length; i++){
	            if(used[i] || i > 0 && arr[i] == arr[i-1] && !used[i - 1]) 
	            {   
	            	    //If element is already used
	            		continue;
	            }
	            //choose element
	            used[i] = true; 
	            resultList.add(arr[i]);
	            
	            //Explore
	            permuteHelper(list, resultList, arr, used);
	            
	            //Unchoose element
	            used[i] = false; 
	            resultList.remove(resultList.size() - 1);
	        }
	    }
	}
 
}
Permuations of array : [10, 20, 10] are:
=========================================
[10, 10, 20]
[10, 20, 10]
[20, 10, 10]