美文网首页
全排列(数字重复与不重复)问题的递归与非递归代码

全排列(数字重复与不重复)问题的递归与非递归代码

作者: 想当厨子的程序员 | 来源:发表于2018-08-24 17:30 被阅读0次

全排列
给定一个数字列表,返回其所有可能的排列。

样例
给出一个列表[1,2,3],其全排列为:

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

递归代码

class Solution:
    """
    @param: nums: A list of integers.
    @return: A list of permutations.
    """
    def permute(self, nums):
        allResult = []
        result = []
        self.permutes(nums, result, allResult)
        return allResult

    def permutes(self, nums, result, allResult):
        # write your code here
        if nums == []:
            new_list = []
            for i in result:
                new_list.append(i)
            allResult.append(new_list)
        for num in nums:
            result.append(num)
            new_nums = []
            for x in nums:
                if x!=num:
                    new_nums.append(x)
            self.permutes(new_nums, result, allResult)
            result.pop()
        return

非递归代码(仅用于数字不重复的全排列问题中,后来改进)

class Solution:
    """
    @param: nums: A list of integers.
    @return: A list of permutations.
    """
    def permute(self, nums):
        nums_used = [0]*len(nums)
        nums_used_in_stack = [[] for j in range(len(nums))]
        stack = []
        allResult = []
        while(True):
            for key, num in enumerate(nums):
                if(nums_used[key] == 0):
                    if num not in nums_used_in_stack[len(stack)]:
                        stack.append(num)
                        nums_used[key] = 1
                        nums_used_in_stack[len(stack) - 1].append(num)
                        try:
                            nums_used_in_stack[len(stack)] = []
                        except IndexError:
                            pass

            if(len(stack) == len(nums)):
                result = []
                for i in stack:
                    result.append(i)
                allResult.append(result)

                while (True):
                    try:
                        x = stack.pop()
                    except IndexError:
                        return allResult
                    for key2, num2 in enumerate(nums):
                        if num2 == x:
                            nums_used[key2] = 0

                    flag = 0
                    for key3, num3 in enumerate(nums):
                        if nums_used[key3] == 0 and num3 not in nums_used_in_stack[len(stack)]:
                            flag = 1
                            break
                        else:
                            flag = 0
                    if(flag == 0):
                        continue
                    else:
                        break

附上题目来源:
https://www.lintcode.com/problem/kth-largest-element/description

带重复元素的排列
给出一个具有重复数字的列表,找出列表所有不同的排列。

样例
给出一个列表[1,2,2],其全排列为:

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

挑战
使用递归和非递归分别来完成该题。

递归代码

class Solution:
    """
    @param: nums: A list of integers.
    @return: A list of permutations.
    """
    def permuteUnique(self, nums):
        allResult = []
        result = []
        self.permutes(nums, result, allResult)
        return allResult

    def permutes(self, nums, result, allResult):
        # write your code here
        nums_used = []
        if nums == []:
            new_list = []
            for i in result:
                new_list.append(i)
            allResult.append(new_list)
        for index in range(0, len(nums)):
            if nums[index] not in nums_used:
                result.append(nums[index])
                nums_used.append(nums[index])
                new_nums = []
                for x in nums:
                    new_nums.append(x)
                del new_nums[index]
                self.permutes(new_nums, result, allResult)
                result.pop()
        return

非递归代码(改进之后,可用于数字重复或不重复的全排列问题中)

class Solution:
    """
    @param: nums: A list of integers.
    @return: A list of permutations.
    """
    def permuteUnique(self, nums):
        nums_used = [0]*len(nums)
        nums_used_in_stack = [[] for j in range(len(nums))]
        stack = []
        allResult = []
        while(True):
            for key, num in enumerate(nums):
                if(nums_used[key] == 0):
                    if num not in nums_used_in_stack[len(stack)]:
                        stack.append([key, num])
                        nums_used[key] = 1
                        nums_used_in_stack[len(stack) - 1].append(num)
                        try:
                            nums_used_in_stack[len(stack)] = []
                        except IndexError:
                            pass

            if(len(stack) == len(nums)):
                result = []
                for i in stack:
                    result.append(i[1])
                allResult.append(result)

                while (True):
                    try:
                        x = stack.pop()[0]
                    except IndexError:
                        return allResult
                    for key2, num2 in enumerate(nums):
                        if key2 == x:
                            nums_used[key2] = 0

                    flag = 0
                    for key3, num3 in enumerate(nums):
                        if nums_used[key3] == 0 and num3 not in nums_used_in_stack[len(stack)]:
                            flag = 1
                            break
                        else:
                            flag = 0
                    if(flag == 0):
                        continue
                    else:
                        break

附上题目来源:
https://www.lintcode.com/problem/permutations-ii/description

相关文章

  • 全排列(数字重复与不重复)问题的递归与非递归代码

    全排列给定一个数字列表,返回其所有可能的排列。 样例给出一个列表[1,2,3],其全排列为: 递归代码 非递归代码...

  • 全排列

    递归不支持字典序,只支持全排列 1. 不含重复元素的全排列 2. 含重复元素 非递归处理 支持处理重复元素(不包含...

  • 全排列与全组合

    递归+交换值实现全排列 非重复的全排列 位运算实现全组和

  • Leetcode.46.Permutations

    题目 给定一个没有重复数字的数字序列, 输出这写数字的全排列组合. 思路 这种全排列的问题最直接的思路就是递归. ...

  • 字符串的全排列和组合算法

    1. 排列 链接注意字符重复与非重复两种情况的区别。非递归实现有点麻烦 2. 组合 2.1 什么是组合 有abc得...

  • 排列

    上述代码中列出了 全排列的非递归、递归解法 从n个数中取m个的各种排列形式输出

  • 字符串全排列问题

    今天学习了字符串全排列问题的递归与非递归实现,其中,递归实现是把递归放在循环中,到现在我也没看懂到底是个什么样的过...

  • 斐波纳契数列实现及优化

    1.递归实现 2.非递归实现 问题分析:在递归实现中,由于大量的重复运算导致速度慢,所以采用非递归形式,思路也非常...

  • 全排列,组合(字符串或数字)字典序

    无重复字符的全排列和组合数目问题(求这类问题一般用递归,把问题分解成1+n-1,对n-1部分继续递归分解) 组合:...

  • 递归

    文章结构 递归是什么 递归需要满足的三个条件 如何编写递归代码 递归代码要警惕堆栈溢出 递归代码要警惕重复计算 怎...

网友评论

      本文标题:全排列(数字重复与不重复)问题的递归与非递归代码

      本文链接:https://www.haomeiwen.com/subject/aoriiftx.html