zoukankan      html  css  js  c++  java
  • Permutations II

    题目

    Given a collection of numbers that might contain duplicates, return all possible unique permutations.

    For example,
    [1,1,2] have the following unique permutations:
    [1,1,2][1,2,1], and [2,1,1].

    方法

    和上一题的方法一样。利用nextPermutation的思想。

    http://blog.csdn.net/u010378705/article/details/31348875

    	private boolean isReverseOrder(int[] num) {
    		for (int i = 0; i < num.length - 1; i++) {
    			if (num[i] < num[i + 1]) {
    				return false;
    			}
    		}
    		return true;
    	}
        public List<List<Integer>> permuteUnique(int[] num) {
        	List<List<Integer>> list = new ArrayList<List<Integer>>();
        	if (num == null || num.length == 0) {
        		return list;
        	}
        	Arrays.sort(num);
        	while (!isReverseOrder(num)) {
        		List<Integer> subList = new ArrayList<Integer>();
        		for (int i = 0; i < num.length; i++) {
        			subList.add(num[i]);
        		}
        		list.add(subList);
        		nextPermutation(num);
        	}
        	List<Integer> subList = new ArrayList<Integer>();
    		for (int i = 0; i < num.length; i++) {
    			subList.add(num[i]);
    		}
    		list.add(subList);
    		nextPermutation(num);
        	return list;
        }
    	
        public void nextPermutation(int[] num) {
            if (num != null && num.length != 0 && num.length != 1) {
                int len = num.length;
                int i = len;
                for (; i > 1; i--) {
                    if (num[i - 1] > num[i - 2]) {
                    	
                    	int flag = 0;
                    	
                    	for (int k = i - 1; k < len; k++) {
                    		if (num[k] <= num[i - 2]) {
                    			flag = k - 1;
                    			break;
                    		}
                    	}
                    	if (flag == 0) {
                    		flag = len - 1;
                    	}
                    	int temp = num[flag];
                    	num[flag] = num[i - 2];
                    	num[i - 2] = temp;
                    	Arrays.sort(num, i - 1, len);
                    	break;
                    }              
                }
            }
        }


  • 相关阅读:
    C语言调用VIX_API开关虚拟机
    (转)Vix_API 操作 VMware
    C# U盘扫描
    设置字符集
    LIS系统通讯程序原理与实现
    Linux命令的简写和全称
    远程桌面如何退出全屏或全屏切换
    C#编程总结(七)数据加密
    c# 小叙 Encoding(三)
    c# 小叙 Encoding(二)
  • 原文地址:https://www.cnblogs.com/wgwyanfs/p/6747621.html
Copyright © 2011-2022 走看看