Skip to content

Latest commit

 

History

History
63 lines (56 loc) · 1.72 KB

排列与组合.md

File metadata and controls

63 lines (56 loc) · 1.72 KB
    // 组合
    public List<List<Integer>> combine(int n, int k) {
        List<List<Integer>> res = new LinkedList<List<Integer>>();
        int[] nums = new int[n];
        for (int i = 0; i < n; i++) {
            nums[i] = i + 1;
        }
        int[] temp = new int[k];
        comb(nums, 0, temp, 0, res);
        return res;
    }

    void comb(int[] arr, int start, int[] tmp, int cnt,
            List<List<Integer>> res) {

        if (cnt >= tmp.length) {
            List<Integer> item = new ArrayList<Integer>(tmp.length);
            for (int i = 0; i < tmp.length; i++) {
                item.add(tmp[i]);
            }
            res.add(item);
        } else {
            for (int i = start; i < arr.length; i++) {
                tmp[cnt] = arr[i];
                comb(arr, i + 1, tmp, cnt + 1, res);

            }
        }
    }

    // 排列
    public List<List<Integer>> permute(int[] nums) {
        List<List<Integer>> res = new LinkedList<List<Integer>>();
        perm(nums, 0, res);
        return res;
    }

    void perm(int[] arr, int k, List<List<Integer>> res) {
        final int LEN = arr.length;
        if (k >= LEN) {
            List<Integer> item = new ArrayList<Integer>(LEN);
            for (int i = 0; i < LEN; i++) {
                item.add(arr[i]);
            }
            res.add(item);
        } else {
            for (int i = k; i < LEN; i++) {
                exch(arr, i, k);
                perm(arr, k + 1, res);
                exch(arr, i, k);
            }
        }
    }

    // 交换
    void exch(int[] arr, int lo, int hi) {

        int tmp = arr[lo];
        arr[lo] = arr[hi];
        arr[hi] = tmp;
    }