查找
二分查找
def binarySearch(nums,findVal):
def binaryServerVal(nums,left,right,findVal):
if left>right:
return -1 # not find
mid = (right+left)//2
midVal = nums[mid]
if findVal>midVal:
return binaryServerVal(nums,mid,right,findVal)
elif findVal<midVal:
return binaryServerVal(nums,left,mid,findVal)
else: # equal
return mid
left = 0
right = len(nums)
return binaryServerVal(nums,left,right,findVal)
二分查找非递归
def binarySearch2(nums,findVal):
left = 0
right = len(nums)
while left < right:
mid = (right+left)//2
if nums[mid]>findVal:
left = mid+1
elif nums[mid]<findVal:
right = mid-1
else:
return mid
return -1
回溯法
def permute(self, nums):
"""
46.permutations 对没有重复数字的数组 进行全排列
"""
if len(nums) == 0:
return []
res = []
def _backtrace(nums, pre_list):
"""
回溯 从待选列表中选取加入
:param nums: 待选列表
:param pre_list: 已经加入的
:return:
"""
# 出口 已经选取完毕,记录结果
if len(nums) <= 0:
res.append(pre_list.copy()) # 这里一定要注意 是把copy的赋给res,不然res会随着pre_list而改变
return
else:
for i in range(len(nums)):
# 1.做选择
pre_list.append(nums[i])
left_nums = nums.copy()
left_nums.remove(nums[i]) # 没有重复元素,可以用remove从待选列表把该数删除
# 2.递归
_backtrace(left_nums, pre_list)
# 3.撤销选择
pre_list.pop() # return之后 pop上个已遍历过的元素
_backtrace(nums, [])
return res
大数相加
def bigNumAdd(num1, num2):
str_num1 = str(num1)
str_num2 = str(num2)
res = []
add = 0
for i in range(len(str_num1))[::-1]:
for j in range(len(str_num2))[::-1]:
oneplus = int(num1[i])+int(num2[j])+add
add = 0
upper = oneplus//10
if upper>0:
res.append(oneplus%10)
add = oneplus//10
else:
res.append(oneplus)
return res[::-1]