LeetCode 腾讯精选练习50--43, 46, 53

43. 字符串相乘

给定两个以字符串形式表示的非负整数 num1 和 num2,返回 num1 和 num2 的乘积,它们的乘积也表示为字符串形式。
示例 1:
输入: num1 = “2”, num2 = “3”
输出: “6”

【思路】
注意哦,这道题的本意并不是让我们把字符串变为整数直接返回运算结果,考的其实是进位的计算。
所以我们需要使用原始竖式乘法的方法去计算,并且优化。本菜鸡目前只能写出如下代码,储存进位和当前位的方法目前还不能熟练掌握。
【实现】

class Solution:
    def multiply(self, num1: str, num2: str) -> str:
        res = 0
        for i in range(len(num1)):
            for j in range(len(num2)):
                res += int(num1[-(i+1)]) * int(num2[-(j+1)]) * (10 ** (j+i))
        return str(res)

46. 全排列

给定一个 没有重复 数字的序列,返回其所有可能的全排列。
示例:
输入: [1,2,3]
输出:
[
[1,2,3],
[1,3,2],
[2,1,3],
[2,3,1],
[3,1,2],
[3,2,1]
]

【思路】
①python自带库解决;
②使用回溯方法。
【实现】

# 使用库
def permute(self, nums: List[int]) -> List[List[int]]:
	return list(itertools.permutations(nums))

# 回溯

class Solution:
    def permute(self, nums: List[int]) -> List[List[int]]:
        res = []
        def backtrack(nums, tmp):
            if not nums:
                res.append(tmp)
                return
            for i in range(len(nums)):
                backtrack(nums[:i] + nums[i+1:], tmp + [nums[i]])
        backtrack(nums, [])
        return res

53. 最大子序和

给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。
示例:
输入: [-2,1,-3,4,-1,2,1,-5,4]
输出: 6
解释: 连续子数组 [4,-1,2,1] 的和最大,为 6。

【思路】
① 通项公式:
遍历一边列表, f ( x i ) f(x_i) f(xi) 代表 x i x_i xi 结尾最大子序和:
f ( x i ) = n u m s [ i ] + max ⁡ ( 0 , f ( x i − 1 ) ) f(x_i) = nums[i] + \max(0, f(x_{i-1}) ) f(xi)=nums[i]+max(0,f(xi1))
将所有结果储存至列表,最后返回这个列表中的最大值。
② 分而治之:
分为左右区间,计算左区间最大子序和 A,计算右区间最大子序和 B,
计算(左区间从右起最大子序和+从右区间从左起最大子序和)C
返回max(A,B,C)

# 通项公式
class Solution:
    def maxSubArray(self, nums: List[int]) -> int:
        res = [nums[0]]
        for i in range(1,len(nums)):
            res.append(nums[i] + max(res[i-1],0))
        return max(res)

# 分而治之
class Solution:
    def maxSubArray(self, nums: List[int]) -> int:
        n=len(nums)
        # 停止条件
        if n==1:
            return nums[0]
        # 分解为子问题
        left=self.maxSubArray(nums[:n//2])
        right=self.maxSubArray(nums[n//2:])
        # 解决子问题
        # 计算左区间从右起最大子序和
        max_l,tmp=-float('inf'),0
        for i in range(n//2-1,-1,-1):
            tmp+=nums[:n//2][i]
            max_l=max(tmp,max_l)
        # 计算右区间从左起最大子序和 
        max_r,tmp=-float('inf'),0
        for i in range(n-n//2):
            tmp+=nums[n//2:][i]
            max_r=max(tmp,max_r)
       	# 合并返回结果
       	return max(max_r+max_l,right,left)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值