1、旋转数字的最小数字,题目为Leetcode153已知一个长度为n的数组,预先按照升序排列,经由1到n次旋转后得到输入数组,求最小数值,该题可以很简单的进行遍历,只要出现arr[i+1] < arr[i],即可返回最小数字nums[i],但这样的时间复杂度为O(n),可以采用二分查找进行改造,
mid = left + (right - left) // 2,if nums[mid] < nums[right]: right = mid,else: left = mid + 1
令right = mid,这样的目的是避免mid为最小下标时,跳过位置。代码参考如下
class Solution:
def findMin(self, nums: List[int]) -> int:
left, right = 0, len(nums) - 1
while left < right:
mid = left + ((right-left) >> 1)
if nums[mid] < nums[right]:
right = mid
else:
left = mid + 1
return nums[left]
2、验证二叉搜索树,题目为Leetcode98,给你一个二叉树的根节点判断其是否是一个有效的二叉搜索树,有效二叉树定义为:节点的左子树只包含小于当前节点的数,节点的右子树只包含大于当前节点的树,所有左子树和右子树自身必须也是二叉搜索树,根据题目所给的性质我们知道中序遍历一定是升序的,我们可以实时判断当前节点的值是否大于前一个中序遍历得到的节点值即可,代码参考如下:
class Solution:
def isValidBST(self, root: Optional[TreeNode]) -> bool:
pre = -inf
def helper(root):
nonlocal pre
if not root:
return True
if not helper(root.left):
return False
if root.val <= pre:
return False
else:
pre = root.val
if not helper(root.right):
return False
return True
return helper(root)