leetcode-指剑offer-2021-08-05

  1. 剑指 Offer 59 - I. 滑动窗口的最大值
  2. 剑指 Offer 59 - II. 队列的最大值
  3. 剑指 Offer 68 - I. 二叉搜索树的最近公共祖先
  4. 剑指 Offer 68 - II. 二叉树的最近公共祖先(同上)
  5. 剑指 Offer 49. 丑数
  6. 剑指 Offer 46. 把数字翻译成字符串
  7. 剑指 Offer 63. 股票的最大利润
  8. 剑指 Offer 64. 求1+2+…+n
剑指 Offer 59 - I. 滑动窗口的最大值
class Solution:
    def maxSlidingWindow(self, nums: List[int], k: int) -> List[int]:
        n = len(nums)
        if n == 0:
            return []
        q = [[-nums[i],i] for i in range(k)] # python默认小顶堆,因此取负,先把第一个窗口元素放进去
        heapq.heapify(q) # 小顶堆
        ans = [-q[0][0]]  #先把第一个窗口的最大值放进答案
        for i in range(k,n):
            heapq.heappush(q, [-nums[i],i]) #窗口向右移动一个,放进去一个元素
            while q[0][1]<=i-k: #如果最大的元素的下标不在本次窗口内,要先删掉他们
                heapq.heappop(q)
            ans.append(-q[0][0])# 目前q的最大值一定在窗口范围内的
        return ans

剑指 Offer 59 - II. 队列的最大值
import queue
class MaxQueue:

    def __init__(self):
        self.deque=queue.deque()
        self.queue=queue.Queue()


    def max_value(self) -> int:
        return self.deque[0] if self.deque else -1


    def push_back(self, value: int) -> None:
        while self.deque and self.deque[-1]<value:
            self.deque.pop()
        self.deque.append(value)
        self.queue.put(value)


    def pop_front(self) -> int:
        if not self.deque:
            return -1
        ans = self.queue.get()
        if ans==self.deque[0]:
            self.deque.popleft()
        return ans
剑指 Offer 68 - I. 二叉搜索树的最近公共祖先
class Solution:
    def lowestCommonAncestor(self, root: 'TreeNode', p: 'TreeNode', q: 'TreeNode') -> 'TreeNode':
        def dfs(node,target,path):
            if not node:
                return
            if node == target:
                path.append(node)
                return node
            left = dfs(node.left, target, path)
            if left:
                path.append(node)
                return node
            right = dfs(node.right, target, path)
            if right:
                path.append(node)
                return node
        q_path=[]
        p_path=[]
        dfs(root, q, q_path)
        dfs(root, p, p_path)
        for i in q_path:
            if i in p_path:
                return i
剑指 Offer 49. 丑数
class Solution:
    def nthUglyNumber(self, n: int) -> int:
        h = [1]
        heapq.heapify(h)
        res=[]
        while len(res)< n:
            min_num=heapq.heappop(h)
            res.append(min_num)
            while h and h[0]==min_num:
                heapq.heappop(h)
            for i in [2,3,5]:
                heapq.heappush(h, min_num*i)
        return res[-1]
剑指 Offer 46. 把数字翻译成字符串
class Solution:
    def translateNum(self, num: int) -> int:
        s = str(num)
        dp = [1 for _ in range(len(s)+1)]
        for i in range(2,len(s)+1):
            if s[i-2] =='1' or s[i-2]=='2' and s[i-1]<'6':# 前面两个数字可以组合在一起翻译
                dp[i] = dp[i-1]+dp[i-2] #有两种可能,一种是每一个数字单独翻译dp[i-1],另一种是两个组合翻译dp[i-2]
            else:
                dp[i] = dp[i-1] # 两个数字只能单独翻译,那么就没有第二种可能,没有增加新的翻译可能
        return dp[-1]

剑指 Offer 63. 股票的最大利润
class Solution:
    def maxProfit(self, prices: List[int]) -> int:
        if not prices:
            return 0
        min_price=prices[0]
        ans=0
        for price in prices:
            ans = max(ans,price-min_price)
            min_price=min(price,min_price)
        return ans
剑指 Offer 64. 求1+2+…+n
class Solution:
    def __init__(self):
        self.res = 0
    def sumNums(self, n: int) -> int:
        n>1 and self.sumNums(n-1) # 逻辑运算符短路效应,if A and B:如果A是False则不会判断B是否成立直接返回False,因此这里当n=1的时候,n>1为False,则不会运行后面的sumNum,从而停止递归
        self.res += n
        return self.res
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值