《剑指 Offer (第 2 版)》第 38 题:字符串的排列(重要,回溯)

第 38 题:字符串的排列(重要,回溯)

传送门:数字排列牛客网 online judge 地址

输入一组数字(可能包含重复数字),输出其所有的排列方式。

样例:

输入:[1,2,3]

输出:

   [
     [1,2,3],
     [1,3,2],
     [2,1,3],
     [2,3,1],
     [3,1,2],
     [3,2,1]
   ]

分析:八皇后问题根据排列组合来求解,关键是判定不符合要求的解。回溯:时间复杂度是 O(n!)

题目描述:跟 LeetCode 47. Permutations II 一模一样,都是不重复的全排列。注意区分上一道题 LeetCode 46. Permutations 。

Python 代码:学会使用位运算判重

class Solution:
    def permutation(self, nums):
        """
        :type nums: List[int]
        :rtype: List[List[int]]
        """

        l = len(nums)
        res = []
        if l == 0:
            return res
        # 因为含有重复数组,所以先排序
        nums.sort()
        path = [0 for _ in range(l)]
        self.__dfs(nums, 0, 0, path, 0, res)

        return res

    def __dfs(self, nums, index, start, path, state, res):
        if index == len(nums):
            res.append(path[:])
            return

        if index == 0 or nums[index] != nums[index - 1]:
            start = 0

        for i in range(start, len(nums)):
            if (state >> i & 1) == 0:
                path[i] = nums[index]
                self.__dfs(nums, index + 1, i + 1, path, state + (1 << i), res)

Java 代码:

import java.util.ArrayList;
import java.util.Stack;

class TreeNode {
    int val = 0;
    TreeNode left = null;
    TreeNode right = null;

    public TreeNode(int val) {
        this.val = val;

    }
}

public class Solution {
    // 使用搜索的策略可以完成
    public ArrayList<ArrayList<Integer>> FindPath(TreeNode root, int target) {
        ArrayList<ArrayList<Integer>> res = new ArrayList<>();
        Stack<Integer> pre = new Stack<>();
        findPath(root, target, pre, res);
        return res;
    }

    private void findPath(TreeNode root, int target, Stack<Integer> pre, ArrayList<ArrayList<Integer>> res) {
        if (root == null || root.val > target) {
            return;
        }
        // 注意:题目中问的是到叶子结点
        if (root.val == target && root.left == null && root.right == null) {
            pre.add(root.val);
            res.add(new ArrayList<>(pre));
            pre.pop();
            return;
        }
        assert root.val < target && root != null;
        pre.add(root.val);
        findPath(root.left, target - root.val, pre, res);
        findPath(root.right, target - root.val, pre, res);
        pre.pop();
    }

    public static void main(String[] args) {
        TreeNode node1 = new TreeNode(1);
        TreeNode node2 = new TreeNode(2);
        TreeNode node3 = new TreeNode(3);
        TreeNode node4 = new TreeNode(4);
        TreeNode node8 = new TreeNode(8);
        TreeNode node7 = new TreeNode(7);

        node1.left = node2;
        node1.right = node3;

        node2.left = node4;
        node2.right = node8;

        node3.left = node7;

        Solution solution = new Solution();
        ArrayList<ArrayList<Integer>> findPath = solution.FindPath(node1, 11);
        System.out.println(findPath);
    }
}
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容