数字排列组合

思路参考上一遍博客:https://blog.csdn.net/qq_32679835/article/details/90041784

一、数字排列

1、数字排列每一次不能将传入的数组直接传入添加到Arraylist中,如果直接添加,在每一次递归添加之后只是通过浅拷贝传入到ArrayList中,就会导致ArrayList中的元素都相同,需要原数组拷贝后传入

2、去重手段不能选择HashSet去重,而是需要在递归过程中判断,判断当前位置的元素在之前元素中已经出现则不能置换

/**
	 * 
	 * bench位置与pionter-----bench-1位置是否交换
	 * 
	 * @param str
	 * @param pointer
	 * @param j
	 * @return
	 */
	public boolean isSwap(int[] str, int pointer, int bench) {
		boolean flag = true;
		for (int i = pointer; i < bench; i++) {
			if (str[bench] == str[i]) {
				flag = false;
			}
		}
		return flag;
	}

3、代码

ArrayList<int[]> list = new ArrayList<>();

    //主函数
	public ArrayList<int[]> Per(int[] arr) {
		if (arr == null || arr.length == 0) {
			return null;
		}
		int pointer = 0;
		oper(arr, pointer,arr.length);
		return list;
	}
	/**
	 * 数字全排列问题
	 * @param arr
	 * @param pointer
	 * @param end
	 */
	private void oper(int[] arr, int pointer,int end) {
		int[] temp = new int[arr.length];
		if (pointer == arr.length) {
			for (int i = 0; i < arr.length; i++) {
				temp[i] = arr[i];
			}
			list.add(temp);
			return;
		} else {
			for (int i = pointer; i < end; i++) {
				if(isSwap(arr, pointer, i)) {
					swap(arr, i, pointer);
					oper(arr, pointer + 1,end);
					swap(arr, pointer, i);
				}
				
			}
		}
	}

二、数字组合

1、最终存储结构ArrayList<ArrayList<Integer>> res = new ArrayList<>();

2、去重方式采取HashSet去重

3、同样由于ArrayList与String的差别,ArrayList中存储一种结果,不能直接添加到res结构中,需要通过临时变量来赋值,保证了结果不会堆积在一起

4、代码

/**
	 * 数字组合问题
	 * @param arr
	 * @return
	 */
	ArrayList<ArrayList<Integer>> res = new ArrayList<>();
	HashSet<ArrayList<Integer>> setcom = new HashSet<>();
	public ArrayList<ArrayList<Integer>> combination(int[] arr) {
		if(arr==null || arr.length== 0) {
			return null;
		} 
		com(arr,0,new ArrayList<Integer>());
		return res;
	}
	private void com(int[] arr, int pointer, ArrayList<Integer> step) {
		ArrayList<Integer> temp = new ArrayList<>();
		for (int i = 0; i < step.size(); i++) {
			temp.add(step.get(i));
		}
		if(pointer == arr.length) {
			if(!setcom.contains(temp)) {
				res.add(temp);
				setcom.add(temp);
				return ;
			}
			
		}else {
			com(arr, pointer+1, temp);
			temp.add(arr[pointer]);
			com(arr, pointer+1, temp);
		}
	}

三、测试

public static void main(String[] args) {
		int[] str = { 1, 1, 3 };
		PermutationData data = new PermutationData();
		System.out.println("===========排列=============");
		ArrayList<int[]> res = data.Per(str);
		for (int j = 0; j < res.size(); j++) {
			System.out.println();
			for (int i = 0; i < res.get(j).length; i++) {
				System.out.print(res.get(j)[i] + " ");
			}
		}
		System.out.println("\n===========组合===============");
		ArrayList<ArrayList<Integer> > rescom = data.combination(str);
		for(int i=0; i<rescom.size();i++) {
			System.out.println();
			for (int j = 0; j < rescom.get(i).size(); j++) {
				System.out.print( rescom.get(i).get(j)+" ");
			}
		}
		
		
	}

四、结果

===========排列=============

1 1 3 
1 3 1 
3 1 1 
===========组合===============


3 
1 
1 3 
1 1 
1 1 3 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值