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到最后结果中。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

yuanCruise

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值