Leetcode(Python):排列问题(permutation)

Permutation

返回nums矩阵的所有排列情况。例子:【1,2,3】首先把1加入到原始矩阵中,然后选择2放的位置,2放的位置有两个选择1前面或者后面,因此产生两个子列表{1,2}、{2,1}。对于第三个数,在前面的每个子列表中又有len(字列表)+1的位置可以选择。这样就完成了全体排列。(在代码中,首先循环整个nums列表,对每个子perm进行构建,每个子perm构建时要知道位置数目都是当前子perm长度加一)
这里写图片描述

Permutation 2

考虑nums中元素有重复的情况。方案一 仍然利用permutation中的手段,外加一句列表推导式的操作(用于去掉重复元素),可以实现但时间复杂度比较高。换一句话,效率瞬间提高,当当前perm[i]与现在要插入的num相等时,先插入再跳出本次插入(意思是插入一次就够啦)。
这里写图片描述
这里写图片描述

Next Permutation

理解这道题就要理解题目中给出的lexicographically(字典序法):
【字典序法】
C++的STL库里面有nextPermutation()方法,其实现就是字典序法。
下图简单明了地介绍了字典序法
这里写图片描述这里写图片描述
这里写图片描述
这里写图片描述

Permutation Sequence

输入k,返回nums中第k个排列。主要的解题思路对于nums中为n个数字,前(n-1)!个数字是1开头,之后(n-1)! 个数字是2开头,再之后(n-1)!个数字是3开头••••••and so on。在每一组(n-1)!个数中,前(n-2)!个数是最小的那个数开头••••••,根据这种规律,对于输入的k来说,确定第一个index就是k的实际索引(k-1)除以(n-1)!得到的商,下一个索引就是上面求得的余数再除以(n-2)!得到的商,依次类推返回得到结果。
这里写图片描述

Palindrome permutation

判断输入字符串是否为回文序列,若字符串长度为偶数,且哈希表为空则字符串为回文序列,若字符串长度为基数,且哈希表长度为1则字符串为回文序列。
这里写图片描述

Palindrome permutation2

1.先用hashtable记录每个字符出现的个数
2.判断出现奇数的键,若出现奇数的键大于1则result返回为空,否则把这个奇数的值取出来,放到mid中,后续组合结果时,将mid放到中间
3.把hashtable中的所有值都除以2后得到的个数加入res中(这种情况下,偶数的话结果为原始数据的一半,奇数的话若原本为1则结果为0,若原本为3则结果为1,所以这种操作具有普适性)
4.通过上述方法得到res之后,对res进行全排列,每进行一次排列就把mid和逆序加上,并append到最后结果中。

猜你喜欢

转载自blog.csdn.net/qiu931110/article/details/80163981