43. 字符串相乘
class Solution:
def multiply(self, num1: str, num2: str) -> str:
if num1 == '0' or num2 == '0':
return '0'
l1, l2 = len(num1), len(num2)
if l1 < l2:
num1,num2 = num2, num1
l1, l2 = l2, l1
num2 = num2[::-1]
res = '0'
for i, digit in enumerate(num2):
# print(digit)
# print(self.StringMultiplyInt(num1, int(digit)))
temp = self.StringMultiplyInt(num1, int(digit)) + '0'*i
# print(temp)
res = self.StringPlusString(temp, res)
return res
def StringMultiplyInt(self, strings, digit):
strings = strings[::-1]
res = []
for char in strings:
res.append(int(char) * digit)
res = self.CarrySolver(res)
return "".join(str(x) for x in res)
def StringPlusString(self, string1, string2):
string1 = string1[::-1]
string2 = string2[::-1]
l1, l2 = len(string1), len(string2)
if l1 < l2:
string1, string2 = string2, string1
l1,l2 = l2,l1
res = []
for i in range(l2):
res.append(int(string1[i]) + int(string2[i]))
for j in range(i+1, l1):
res.append(int(string1[j]))
# print(res)
res = self.CarrySolver(res)
return "".join(str(x) for x in res)
def CarrySolver(self, nums): # lists[int,int..]
n = len(nums)
for i in range(n):
if nums[i] >=10:
carrier = nums[i] // 10
if i == n-1:
nums.append(carrier)
else:
nums[i+1] += carrier
nums[i] = nums[i] % 10
nums = nums[::-1]
return nums
46 全排列
class Solution:
def permute(self, nums: List[int]) -> List[List[int]]:
res = []
def backtrack(nums, track):
if len(track) == len(nums):
# print(track)
# print(res.append(track[:]))
res.append(track[:])
# 注意这里是track的拷贝
return
n = len(nums)
for i in range(n):
if nums[i] in track:
continue
track.append(nums[i])
backtrack(nums, track)
track.pop()
backtrack(nums, [])
return res
53 最大子序和
dp[i]表示nums[…i]的最大子序和是多少
dp[i+1] 只有两种选择,要么和前面的子数组合并,要么自成一派,即要么是dp[i] + nums[i+1],要么是nums[i+1]
class Solution:
def maxSubArray(self, nums: List[int]) -> int:
n = len(nums)
dp = [0]*n
dp[0] = nums[0]
for i in range(1,n):
dp[i] = max(nums[i], dp[i-1]+nums[i])
# dp[i]表示nums[....i]的最大子序和是多少
res = nums[0]
for j in range(n):
res = max(res, dp[j])
return res