022/leetcode

/medium/198. House Robber/198.house-robber.py
def findMin(nums):
# 二分查找
l, r = 0, len(nums) - 1
while l < r:
mid = l + (r - l) // 2
if nums[mid] > nums[r]:
l = mid + 1
else:
r = mid
return nums[l]

def findMax(nums):
# 二分查找
l, r = 0, len(nums) - 1
while l < r:
mid = l + (r - l) // 2
if nums[mid] < nums[r]:
r = mid
else:
l = mid + 1
return nums[l]

class Solution:
def findOriginalArray(self, changed):
# 思路:找到原数组的最小值和最大值,然后把原数组排序,从最小值开始遍历,如果当前元素等于最大值,那么说明是原数组中
# 的一个元素,那么就把它删除,继续遍历,如果当前元素小于最大值,那么就把当前元素删除,继续遍历,如果当前元素大于最大值,
# 那么就说明不是原数组中的元素,返回False
# 如果当前元素等于最小值,那么就把当前元素删除,继续遍历
# 如果当前元素大于最小值,那么就把当前元素删除,继续遍历
# 如果遍历结束,那么说明是原数组,返回原数组
changed.sort()
if len(changed) % 2 == 1:
return []
minVal = findMin(changed)
maxVal = findMax(changed)
ans = []
for num in changed:
if num == maxVal:
ans.append(minVal)
minVal = findMin(changed)
maxVal = findMax(changed)
elif num < maxVal:
minVal = findMin(changed)
maxVal = findMax(changed)
else:
return []
return ans

/medium/170. Super Egg Drop/170.super-egg-drop.py
def findMin(nums):
l, r = 0, len(nums) - 1
while l < r:
mid = l + (r - l) // 2
if nums[mid] > nums[r]:
l = mid + 1
else:
r = mid
return nums[l]

class Solution:
def findPeakElement(self, nums):
# 二分查找
l, r = 0, len(nums) - 1
while l < r:
mid = l + (r - l) // 2
if nums[mid] > nums[mid + 1]:
r = mid
else:
l = mid + 1
return l

# 二分查找
l, r = 0, len(nums) - 1
while l < r:
mid = l + (r - l) // 2
if nums[mid] < nums[mid + 1]:
l = mid + 1
else:
r = mid
return l

# 二分查找
l, r = 0, len(nums) - 1
while l < r:
mid = l + (r - l) // 2
if nums[mid] > nums[mid - 1] and nums[mid] > nums[mid + 1]:
return mid
elif nums[mid] > nums[mid - 1] and nums[mid] < nums[mid + 1]:
l = mid + 1
elif nums[mid] < nums[mid - 1] and nums[mid] > nums[mid + 1]:
r = mid - 1
else:
return -1

class Solution:
def findPeakElement(self, nums):
# 二分查找
l, r = 0, len(nums) - 1
while l < r:
mid = l + (r - l) // 2
if nums[mid] > nums[mid + 1]:
r = mid
else:
l = mid + 1
return l

class Solution:
def findPeakElement(self, nums):
# 二分查找
l, r = 0, len(nums) - 1
while l < r:
mid = l + (r - l) // 2
if nums[mid] > nums[mid + 1]:
r = mid
else:
l = mid + 1
return l

/medium/1033. Moving Stones Until Destination/1033.moving-stones-until-destination.py
class Solution:
def findCircleNum(self, M):
# 拓扑排序
if not M:
return 0
# 顶点数
n = len(M)
# 邻接表
edges = collections.defaultdict(list)
# 对顶点进行邻接表的建图
for i in range(n):
for j in range(n):
if M[i][j] == 1 and i != j:
edges[i].append(j)
# 初始化入度数组
in_degree = [0] * n
# 初始化队列
queue = collections.deque()
for i in range(n):
for neighbor in edges[i]: