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(xi−1))
将所有结果储存至列表,最后返回这个列表中的最大值。
② 分而治之:
分为左右区间,计算左区间最大子序和 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)