Leetcode1数组练习

66:plus one

代码部分1

class Solution:
    def plusOne(self, digits: List[int]) -> List[int]:
        l=[1]
        c=0
        if len(digits)==0:
            return digits
        cur=len(digits)-1
        while cur+1:
            if digits[cur]==9:
                d1=digits[cur+1:]
                digits=digits[:cur]
                digits.append(0)
                digits.extend(d1)
                cur-=1
                c=1
            else:
                digits[cur]+=1
                cur=-2
                break
        if cur==0 or cur==-1:
            l.extend(digits)
            digits=l
        return digits

**主要思路:**想法比较简单,当发现cur位置为9时截取长度[:cur]以及[cur+1:],cur位置处置为0

Runtime: 36 ms, faster than 88.65% of Python3
Memory Usage: 12.9 MB, less than 98.54%

代码部分2

        if len(digits) == 0:
            digits = [1]
        elif digits[-1] == 9:
            digits = self.plusOne(digits[:-1])
            digits.extend([0])
        else:
            digits[-1] += 1
        return digits

Runtime: 36 ms, faster than 88.65% of Python3
Memory Usage: 13.2 MB, less than 57.36% of Python3

递归的方式:
优点:代码简洁漂亮
缺点:空间复杂度会稍微大一点点

31. Next Permutation

题意理解

本题目标:输入一个list,求取该list的各个数字的各种排列组合的情况下仅大于本list的下一种组合方式
思路:list从后往前查找当nums[i-1]<nums[i]时,锁定从i位置起是需要重新排列的部分,并且需要寻找nums[i:]中大于nums[i-1]的最小值并与之交换

代码部分

class Solution:
    def nextPermutation(self, nums: List[int]) -> None:
        """
        Do not return anything, modify nums in-place instead.
        """
        c=1
        for i in range(len(nums)-1,0,-1):
            if nums[i-1] < nums[i]:
                vol=max(nums[i:])
                cur=i
                for j in range(i,len(nums)):
                    if nums[j]>nums[i-1] and nums[j]<vol:
                        vol=nums[j]
                        cur=j
                nums[i-1],nums[cur] = nums[cur],nums[i-1]
                nums[i:]=sorted(nums[i:])
                c=0
                break
        if c:nums.sort()

Runtime: 36 ms, faster than 97.38% of Python3

Memory Usage: 13.1 MB, less than 78.38%

评价:方法不难,重在理解如何寻找仅大于本轮list的下一轮排列组合方式

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值