leetcode-剑指offer-5

  • 59.面试题59-队列的最大值
  • 60.面试题64-求1+2+...+n
  • 61.面试题65-不用加减乘除做加法
  • 62.面试题66-构建乘积数组
  • 63.面试题68-1二叉树搜索树的最近公共祖先
  • 64.面试题68-2二叉树的最近公共祖先
  • 65.面试题67-把字符串转换成数字-自动机
  • 66.面试题20-表示数值的字符串-自动机

本系列博文为题库刷题笔记,(仅在督促自己刷题)如有不详之处,请参考leetcode官网:https://leetcode-cn.com/problemset/lcof/

59.面试题59-队列的最大值

请定义一个队列并实现函数 max_value 得到队列里的最大值,要求函数max_value、push_back 和 pop_front 的均摊时间复杂度都是O(1)。

若队列为空,pop_front 和 max_value 需要返回 -1

思路1:直接定义一个队列,

import Queue
class MaxQueue(object):def __init__(self):self.deque=Queue.deque()def max_value(self):""":rtype: int"""return max(self.deque) if self.deque else -1def push_back(self, value):""":type value: int:rtype: None"""self.deque.append(value)def pop_front(self):""":rtype: int"""return self.deque.popleft() if self.deque else -1

时间复杂度:插入操作o(1),删除操作o(1),取最大值o(n)

思路2:维护一个辅助双端队列,用于存储最大值,每次插入元素时,将辅助双端队列的尾部小于插入元素的值去除,然后加入该元素。每次弹出队列头部时,比较弹出元素与辅助队列的头是否一致,如果一致,更新双端队列头部( 弹出该头部)

import Queue
class MaxQueue(object):def __init__(self):self.helper=Queue.deque()   # deque[0] 最大值,deque[-1]最小值self.queue=Queue.Queue()def max_value(self):""":rtype: int"""return self.helper[0] if self.helper else -1def push_back(self, value):""":type value: int:rtype: None"""while(self.helper and self.helper[-1]<value):self.helper.pop()    # 弹出双端队列尾部的元素self.helper.append(value) # 在双端队列尾部加入元素self.queue.put(value)  # 在队列尾加入元素def pop_front(self):""":rtype: int"""if not self.helper:  # 为什么要是helper queue不行return -1ans=self.queue.get()  # 弹出队列头if ans==self.helper[0]:self.helper.popleft()  # 双端队列弹出队列头部元素return ans
# Your MaxQueue object will be instantiated and called as such:
# obj = MaxQueue()
# param_1 = obj.max_value()
# obj.push_back(value)
# param_3 = obj.pop_front()

时间复杂度:删除o(1),最大o(1),求最大值:均摊时间复杂度o(1),做一个插入操做最多会有n次出队操作,但是每个数字只会出队一次,所以维护n个元素最大值的总出队操作也就是n,即均摊时间复杂度为0(1)。

60.面试题64-求1+2+…+n

求 1+2+…+n ,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)。

思路1:求和公式,使用到了乘除法,不可用
1+2+3,...,n=(1+n)∗n/21+2+3,...,n=(1+n)*n/21+2+3,...,n=(1+n)∗n/2

思路2:迭代要使用循环语句,不可

思路3:递归,递归出口时需要用到判断语句,但是判断语句可以使用逻辑运算符的短路作用,开启递归或结束递归:
n>1andsumNums(n−1)n>1 \ \ and \ \ sumNums(n-1)n>1  and  sumNums(n−1)

当n>1 时会开启下一层递归,当n=1,不执行递归,执行之后的操作

class Solution(object):def __init__(self):self.res=0def sumNums(self, n):""":type n: int:rtype: int"""def rec(num):num>1 and rec(num-1)self.res+=numrec(n)return self.res

61.面试题65-不用加减乘除做加法

写一个函数,求两个整数之和,要求在函数体内不得使用 “+”、“-”、“*”、“/” 四则运算符号。
思路:不用加减乘除做加法,借助位运算。
经过观察可以发现,两个数字的二进制和,对应位置上的结果运算规律和异或一致,进位位置上的结果和and运算相同。将两数异或 的结果和and 的结果相加,等价于求原来两个数字的和。又出现两数求和操作,重复两数求和求异或。直至进位为0,不存在加法操作。
注意点:python 中的数字以补码的形式存储,python中的数字没有长度,依据题目要求,需要舍去大于32位以上的数字。
补码还原:~(a^x)

class Solution(object):def add(self, a, b):""":type a: int:type b: int:rtype: int"""x = 0xffffffffa, b = a & x, b & xwhile b != 0:a, b = (a ^ b), (a & b) << 1 & xreturn a if a <= 0x7fffffff else ~(a ^ x)

62.面试题66-构建乘积数组

给定一个数组 A[0,1,…,n-1],请构建一个数组 B[0,1,…,n-1],其中 B 中的元素 B[i]=A[0]×A[1]×…×A[i-1]×A[i+1]×…×A[n-1]。不能使用除法。
思路:暴力解法43/44时间超出限制

class Solution(object):def constructArr(self, a):""":type a: List[int]:rtype: List[int]"""n=len(a)b=[1]*nfor i in range(n):for j in range(n):if j!=i:b[i]*=a[j]return b

思路2:左右乘积数组
l[i]=a[0]*…a[i-1]
r[i]=a[i+1]*…a[n-1]

在这里插入代码片class Solution(object):def constructArr(self, a):""":type a: List[int]:rtype: List[int]"""n=len(a)b=[1]*nleft=[1]*nright=[1]*nfor i in range(1,n):left[i]=left[i-1]*a[i-1]for i in range(n-2,-1,-1):right[i]=right[i+1]*a[i+1]for i in range(n):b[i]=left[i]*right[i]return b

63.面试题68-1二叉树搜索树的最近公共祖先

给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先。
百度百科中最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。”

思路:一个节点为最近祖先:pq 在该节点的两棵子树/p=root 或者q=root。

首先判断 p 和 q 是否相等,若相等,则直接返回 p 或 q 中的任意一个,程序结束
若不相等,则判断 p 和 q 在向左还是向右的问题上,是否达成了一致
如果 p 和 q 都小于root, 哥俩一致认为向左

算法(23)-leetcode-剑指offer7相关推荐

  1. 【LeetCode 剑指offer刷题】矩阵题1:4 有序矩阵中的查找( 74. Search a 2D Matrix )(系列)...

    [LeetCode & 剑指offer 刷题笔记]目录(持续更新中...) 74. Search a 2D Matrix Write an efficient algorithm that s ...

  2. leetcode 打印_剑指 Offer 32 - III 从上到下打印二叉树 III - leetcode 剑指offer

    题目难度: 中等 原题链接 今天继续更新剑指 offer 系列, 这道题相比昨天那道题多了个每层打印方向不同的需求, 聪明的你想到应该如何实现了吗? 老样子晚上 6 点 45 分准时更新公众号 每日精 ...

  3. leetcode 打印_剑指 Offer 总结 - leetcode 剑指offer系列

    剑指 Offer 系列完结撒花!! 本篇文章是对整个系列的精华总结, 对系列的每篇文章进行了分类, 并用一句话概括每道题的思路, 方便大家理解和记忆, 当然也包含原文完整链接供大家参考 总的来说, 写 ...

  4. leetcode剑指offe刷题-第一题-用两个栈实现队列

    leetcode剑指offe刷题-第一题 文章目录 leetcode剑指offe刷题-第一题 前言 一.用两个栈实现队列 1.思路 2.代码如下 总结 前言 记录一下自己刷算法的路程. leetcod ...

  5. LeetCode 剑指Offer 13 机器人的运动范围

    LeetCode 剑指Offer 13 机器人的运动范围 题目 解题 解题一:深度优先搜索 解题二:广度优先搜索 解题三:动态规划 题目 解题 深度优先和广度优先解题思路参考: 剑指 Offer 13 ...

  6. Python描述 LeetCode 剑指 Offer 30. 包含min函数的栈

    Python描述 LeetCode 剑指 Offer 30. 包含min函数的栈   大家好,我是亓官劼(qí guān jié ),在[亓官劼]公众号.CSDN.GitHub.B站等平台分享一些技术 ...

  7. 【LeetCode 剑指offer刷题】树题6:28 对称二叉树(101. Symmetric Tree)

    [LeetCode & 剑指offer 刷题笔记]目录(持续更新中...) 101. Symmetric Tree /**  * Definition for a binary tree no ...

  8. 【LeetCode 剑指offer刷题】数组题2:57 有序数组中和为s的两个数(167 Two Sum II - Input array is sorted)...

    [LeetCode & 剑指offer 刷题笔记]目录(持续更新中...) 57 有序数组中和为s的两个数 题目描述 输入一个递增排序的数组和一个数字S,在数组中查找两个数,是的他们的和正好是 ...

  9. 【LeetCode 剑指offer刷题】字符串题6:67 把字符串转成整数

    [LeetCode & 剑指offer 刷题笔记]目录(持续更新中...) 67 把字符串转成整数 题目描述 将一个字符串转换成一个整数,要求不能使用字符串转换整数的库函数. 数值为0或者字符 ...

  10. 【LeetCode 剑指offer刷题】树题16:Kth Smallest Element in a BST

    [LeetCode & 剑指offer 刷题笔记]目录(持续更新中...) Kth Smallest Element in a BST Given a binary search tree, ...

最新文章

  1. 【Android 逆向】函数拦截 ( ARM 架构下的插桩拦截 | 完整代码示例 )
  2. 创建动态链接库时设置导出函数的方法
  3. python查看指令的方法python -h
  4. AS3.1.2配置gradle阿里云镜像(可用)
  5. 力软敏捷开发框架7.0.6源码
  6. 数据结构与算法: Asymptotic Analysis 渐近分析
  7. 云端地球:让每个人都能在线生成大场景三维
  8. centos/linux 服务器的内存不够了怎么办?centos用虚拟内存扩展内存
  9. Kaggle注册及绑定手机号
  10. html主菜单和子菜单,刻录dvd光盘设置dvd菜单 只要子菜单可以吗 不要主菜单的
  11. 虞美人【秦观】鸳鸯惊起不无愁。柳外一双飞去、却回头。
  12. 《C++ Primer中文版(第五版)》 第九章 顺序容器
  13. 采用deepdive的上市公司关系抽取
  14. ERP流程二 实体类大全
  15. python基础-闰年判断
  16. MATLAB:指定坐标轴范围、轴向、位置
  17. 小白福音——VBA编程常用——命令三百例
  18. 网络克隆(Netghost8.0)图文教程
  19. 企业数据无忧 飞客功不可没
  20. win10解压安装mysql方法及遇见的问题(缺少MSVCR120.dll文件、服务无法启动)

热门文章

  1. linux内核I2C子系统学习(二)
  2. 修改SMDK6410的调试串口为普通串口(wince系统)
  3. WinCE中的RAM-Based Registry与HIVE-Based Registry
  4. 学习linux/unix编程方法的建议[转]
  5. mysql client 未开启_Django+mysqlclient未关闭数据库连接
  6. 彩虹六号服务器显示,彩虹六号怎么看自己在什么服务器 | 手游网游页游攻略大全...
  7. ashx连接mysql_对C#中的web访问mysql数据库的一些知识点进行了整理归纳总结
  8. 坦克大战代码_坦克大战系列文章-坦克大战简介
  9. 【转】SOAR从概念到落地
  10. WSPBuilder 生成Webpart 部署包