x 的平方根
思路
采用二分查找的思路: 定义好最小值和最大值区间,在区间中找到中间值,计算中间值的平方与x的大小,并基于大小判断缩短区间窗口或直接找到答案。
代码
class Solution:
# def mySqrt(self, x: int) -> int:
def mySqrt(self, x):
"""
二分查找
:param x:
:return:
"""
def helper(min_value, max_value):
mid = int((max_value - min_value) / 2) + min_value
if mid * mid <= x and (mid + 1) * (mid + 1) > x:
return mid
elif (mid + 1) * (mid + 1) <= x:
return helper(mid+1, max_value)
else:
return helper(min_value, mid)
return helper(0, x)
有效的完全平方数
思路
延续上一题思路,继续二分查找,只是从查找数值改为判断true或者false
代码
def helper(min_value, max_value):
mid = int((min_value + max_value) / 2)
if mid * mid == num:
return True
elif mid * mid < num and (mid + 1) * (mid + 1) > num:
return False
elif (mid + 1) * (mid + 1) <= num:
return helper(mid+1, max_value)
else:
return helper(min_value, mid)
return helper(0, num)
最小基因变化
思路
- BFS搜索
- bank做成visit_set来避免回路
- 每一次下探过程是修改一个字符
代码
class Solution:
# def minMutation(self, start: str, end: str, bank: List[str]) -> int:
def minMutation(self, start, end, bank):
"""
BFS搜索最短路径
:param start:
:param end:
:param bank:
:return:
"""
bank_set = set(bank)
ch_map = {
"A": "CGT",
"C": "AGT",
"G": "ACT",
"T": "ACG"
}
queue = [(0, start)]
while len(queue) > 0:
num, word = queue.pop(0)
if word == end:
return num
for index, ch in enumerate(word):
for new_ch in ch_map[ch]:
new_word = word[:index] + new_ch + word[index+1:]
if new_word not in bank_set:
continue
else:
queue.append((num+1, new_word))
bank_set.remove(new_word)
return -1