LeetCode刷题(4)

permutation
字典序1,2,3—>1,3,2—>2,1,3—>2,3,1—>3,1,2—>3,2,1—>1,2,3
1.Next Permutation
寻找下一个序列的过程,首先找到第一个非降序的point,之后将该point与后续第一个大于该数的point对换,之后将后续数组逆序。

        n = len(nums) - 1
        m = n
        while m:
            if nums[m] > nums[m - 1]:
                break
            m -= 1
        if not m:
            nums.sort()
        #index = nums[m - 1]    
        else :
            index = nums[m - 1]
            l = n
            while l:
                if nums[l] > index:
                    break
                l -= 1
            nums[m - 1], nums[l] = nums[l], nums[m - 1]
            nums[m:n+1] = nums[m:n+1][::-1]

2.permute:
递归算法,在任意位插入新point

return nums and [node[:i] + [nums[0]] + node[i:]
                     for node in self.permute(nums[1:])
                     for i in range(len(nums))] or [[]]

3.permute 消除重复
以重复数字的第一次出现为标记,不往后插

        res = [[]]
        for p in nums:
            res_n = []
            for node in res:
                for i in xrange(len(node)+1):
                    res_n.append(node[:i]+[p]+node[i:])
                    if i < len(node) and node[i] == p :
                        break
            res = res_n
        return res
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值