1. 树的先序遍历可以求高度,后序遍历可以求深度。

剑指 Offer 55 - II. 平衡二叉树​leetcode-cn.com

2. 二叉搜索树的中序遍历可以递增地返回所有元素。逆序的中序遍历(即先右子节点,再根节点,再左子节点)可以递减的返回所有元素。

3. python 的字典就是非常好的哈希工具。get 方法可以写参数当默认值,常用计数 dic.get(ch, 0) + 1

4. 求质数比较快的方法 ,筛法

isPrime = [True] * (n + 1) # 1, 2, ..., nisPrime[1] = Falseidx = 2while idx <= n:if isPrime[idx]:i = idxwhile idx * i <= n:isPrime[idx * i] = Falsei += 1idx += 1

5. python 快速排序实现可以更简洁,思路更清楚

class Solution:def quickSort(self, A, left, right):if left < right:pos = self.partition(A, left, right)self.quickSort(A, left, pos-1)self.quickSort(A, pos+1, right)def partition(self, A, left, right):i, j = left, rightwhile i < j:while i < j and A[j] >= A[left]: j -= 1while i < j and A[i] <= A[left]: i += 1A[i], A[j] = A[j], A[i]A[i], A[left] = A[left], A[i]return i

6. python 归并排序

"""
def mergeSort(A, left, right):pass
def merge(A, left, mid, right): [left, mid] [mid+1, right]pass观察最外层递归
[3, 2, 4, 5, 7, 1, 9]0  1  2  3  4  5  6    left = 0 right = 6, mid = 3, mergeSort(A, 0, 3), mergeSort(A, 4, 6) merge(A, left = 0, mid = 3,  right = 6)[2, 3, 4, 5, 1, 7, 9]0  1  2  3  4  5  6    A[left], ..., A[mid] 序列 和 A[mid+1], ..., A[right]观察最内层递归
mergeSort(A, left = 2, right = 3):if left < right: Truemid = 2mergeSort(A, left = 2, mid = 2)mergeSort(A, left = mid + 1 = 3, right = 3)merge(A, left = 2, mid = 2, right = 3)
"""def mergeSort(A, left, right):if left < right:mid = (left + right) // 2mergeSort(A, left, mid)mergeSort(A, mid+1, right)merge(A, left, mid, right)def merge(A, left, mid, right):i, j = left, mid + 1 # 合并 A[left], ..., A[mid] 序列 和 A[mid+1], ..., A[right] 序列temp = []while i <= mid and j <= right:if A[i] <= A[j]:temp.append(A[i])i += 1else:temp.append(A[j])j += 1while i <= mid:temp.append(A[i])i += 1while j <= right:temp.append(A[j])j += 1for i in range(len(temp)):A[left+i] = temp[i]L = [4,2,1,5,3,2,1]
mergeSort(L, 0, len(L)-1)

7. python oj 处理标准输入 What does Python's eval() do?

  • 示例1
输入: ["flower","flow","flight"]
输出: "fl"

>>> L = list(map(lambda x: x.strip('"'), input().strip('[]').split(',')))
>? ["flower","flow","flight"]
>>> L
>>> ['flower', 'flow', 'flight']

  • 示例2
输入: [[1,3],[2,6],[8,10],[15,18]]
输出: [[1,6],[8,10],[15,18]]
def merge(self, intervals: List[List[int]]) -> List[List[int]]:

>>> L = eval(input())
>? [[1,3],[2,6],[8,10],[15,18]]
>>> L
>>> [[1, 3], [2, 6], [8, 10], [15, 18]]

8. 二叉树遍历的迭代算法

# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None

  • 前序遍历
class Solution:def preorderTraversal(self, root: TreeNode) -> List[int]:res = []stack = []cur = rootwhile stack or cur:while cur:res.append(cur.val)stack.append(cur)cur = cur.lefttop = stack.pop()cur = top.rightreturn res

  • 后序遍历
class Solution:def postorderTraversal(self, root: TreeNode) -> List[int]:res = []stack = []cur = rootwhile stack or cur:while cur:res.append(cur.val)stack.append(cur)cur = cur.righttop = stack.pop()cur = top.leftreturn res[::-1]

  • 中序遍历
class Solution:def inorderTraversal(self, root: TreeNode) -> List[int]:res = []stack = []cur = rootwhile stack or cur:while cur:stack.append(cur)cur = cur.lefttop = stack.pop() #此时左子树遍历完成res.append(top.val)  #将父节点加入列表cur = top.right #遍历右子树return res

9. BFS

import collections
graph = {"A": ["B", "C"],"B": ["A", "C", "D"],"C": ["A", "B", "D", "E"],"D": ["B", "C", "E", "F"],"E": ["C", "D"],"F": ["D"]
}# 最初版本 BFS
def BFS(graph, s):queue = collections.deque()queue.append(s)seen = set()seen.add(s)while queue:vertex = queue.popleft()nodes = graph[vertex]for w in nodes:if w not in seen:queue.append(w)seen.add(w)print(vertex)BFS(graph, "A") # ABCDEF
print('---------------')# DFS 迭代实现
def DFS(graph, s):stack = []stack.append(s)seen = set()seen.add(s)while stack:vertex = stack.pop()nodes = graph[vertex]for w in nodes:if w not in seen:stack.append(w)seen.add(w)print(vertex)
DFS(graph, "A") # ACEDFB# BFS 打印路径
def BFS(graph, s):queue = collections.deque()queue.append(s)seen = set()seen.add(s)parent = {s: None}while queue:vertex = queue.popleft()nodes = graph[vertex]for w in nodes:if w not in seen:queue.append(w)seen.add(w)parent[w] = vertex# print(vertex)return parentparent = BFS(graph, "A")
v = 'F'
while v != None:print(v)v = parent[v]
# F D B A

10. 并查集

# 对于一维输入
# https://leetcode-cn.com/problems/paths-with-sum-lcci/
class UF:def __init__(self, n):self.rank = [0 for _ in range(n)] # 代表树的高度,用来将树平衡self.up = [i for i in range(n)]def find(self, x):if self.up[x] == x:return xelse:self.up[x] = self.find(self.up[x])return self.up[x]def union(self, x1, x2):r1 = self.find(x1)r2 = self.find(x2)if r1 == r2:returnif self.rank[r1] == self.rank[r2]:self.rank[r1] += 1self.up[r2] = r1elif self.rank[r1] > self.rank[r2]:self.up[r2] = r1else:self.up[r1] = r2

# 对于二维输入
# https://leetcode-cn.com/problems/number-of-islands/
class UnionFind:def __init__(self, grid: List[List[str]]):m, n = len(grid), len(grid[0])self.count = 0self.parent = [-1] * (m * n)self.rank = [0] * (m * n)for i in range(m):for j in range(n):if grid[i][j] == "1":self.parent[i * n + j] = i * n + jdef find(self, i):if self.parent[i] != i:self.parent[i] = self.find(self.parent[i])return self.parent[i]def union(self, x, y):rootx = self.find(x)rooty = self.find(y)if rootx != rooty:if self.rank[rootx] < self.rank[rooty]:rootx, rooty = rooty, rootxself.parent[rooty] = rootxif self.rank[rootx] == self.rank[rooty]:self.rank[rootx] += 1

11. DFS中序遍历树结构并时刻比较先后访问的节点。

注意在什么位置更新上一个访问的节点 preNode。就是什么时候按照中序遍历,中间访问到了新的值,什么时候更新。

# https://leetcode-cn.com/problems/recover-binary-search-tree/solution/zhong-xu-bian-li-by-powcai/
# 恢复二叉树
class TreeNode:def __init__(self, x):self.val = xself.left = Noneself.right = Noneclass Solution:def __init__():self.preNode = Nonedef InOrderTravalsal(root):if not root:returnInOrderTravalsal(root.left)# 把 root.val 和 self.pre.val 进行一些比较# ...# 就在这更新刚刚 preNode. 因为访问下一个节点也一定是在递归函数的这个位置self.preNode = rootInOrderTravalsal(root.right)

python leetcode_leetcode 刷题经验,主力 python相关推荐

  1. python leetcode_LeetCode刷题——第8天(python)

    今天有点挫败,这个递归就是函数中自己调用自己,感觉跟循环那么像但是又想不明白,难受. 第八天--第八题(合并两个有序列表) 看题目: 将两个有序链表合并为一个新的有序链表并返回.新链表是通过拼接给定的 ...

  2. Python小屋刷题软件2425道题目分类速查表

    "Python小屋"编程比赛正式开始 Python小屋刷题软件客户端使用说明(视频讲解) Python小屋刷题神器最近升级的新功能介绍 每次录入新题目时都会更新下面的分类表,请注意 ...

  3. python 制作刷题程序

    python 制作刷题程序 本着方便刷题的目的,作者希望一些在电脑上学习的小伙伴能方便记笔记和刷题练习,然后就做出了这个软件,此程序主要通过截图来保存题目和一些知识点,目前几乎完善完毕,由于可能会出现 ...

  4. 温馨提示--Python小屋刷题神器明天暂停使用1天

    号外号外--Python小屋刷题神器上线啦 温馨提示: Python小屋刷题神器已经连续运行3个月,受到广大Python爱好者的喜爱,每天都有很多朋友在平台上做题练习和学习. 马上就期末了,应任课老师 ...

  5. Python小屋刷题神器最近升级的新功能介绍

    推荐图书: <Python程序设计(第3版)>,(ISBN:978-7-302-55083-9),董付国,清华大学出版社,2020年6月第1次印刷,2021年1月第6次印刷,山东省一流本科 ...

  6. Python小屋刷题神器题目分类速查表

    每次录入新题目时都会更新下面的分类表,请注意查看最新信息. 客观题: Python基础知识:1-36 内置函数.运算符:37-271 列表.元组.字典.集合.切片.推导式:272-679 选择结构与循 ...

  7. Python基础刷题录-1

    Python基础刷题录 2020-08-27 1.实现输出1 - 2 + 3 - 4 + 5 - 6 ... + 99的和 2.改变语句的大小写,使其符合英语书写规范 3.利用下划线将列表的每一个元素 ...

  8. 来自本科生的暴击!进腾讯字节的大牛开源LeetCode刷题经验!

    点击上方"Github中文社区",关注 看遍Github好玩的项目 作者:huber 转载自:量子位 今天,你刷LeetCode了吗? 最近,GitHub上这样一套LeetCode ...

  9. 拿到腾讯字节快手 offer 后,他的 LeetCode 刷题经验在 GitHub 火了!

    杨净 发自 凹非寺  量子位 报道 | 公众号 QbitAI 今天,你刷LeetCode了吗? 最近,GitHub上这样一套LeetCode笔记火了. 一位Java研发工程师分享了一个名为「LeetC ...

最新文章

  1. Mysql 查看、创建、更改 数据库和表
  2. 函数指针,指针函数,数组指针,指针数组 区分
  3. 使用Dockerfile脚本创建镜像
  4. 在ElementUI中改变el-table中的el-table-column样式
  5. 如何优化网站页面提高网页的加载速度
  6. java操作日志记录_通用日志记录(java)
  7. javascript:控制一个元素高度始终等于浏览器高度
  8. C++构造函数(复制构造函数)、析构函数
  9. [Oracle]ORA-600[kdBlkCheckError]LOB坏块处理
  10. Java:关于负数的向上转型
  11. 数据分析的3大阶段6大步骤
  12. 新MacBook Pro软件安装记录
  13. dw如何制作图片自动切换效果_DW制作自动切换图js代码
  14. 显示器固件测试软件,【安全工具】固件可视化分析-工具篇
  15. ps如何把自己的图与样机结合_如何利用PS制作贴图样机那
  16. 第13章 Python建模库介绍--Python for Data Analysis 2nd
  17. 12306 订票助手(火车票订票插件)
  18. 计算机人工智能分数,分数一般想学人工智能?这6所双一流大学是首选
  19. 【线性代数】6-7:SVD分解(Singular Value Decomposition-SVD)
  20. 数商云:电商倒逼中药材专业市场交易,数字化助力中医药传承创新

热门文章

  1. 川崎机器人c#通讯(转)
  2. 移动服务安全现状分析!
  3. zabbix自动发现监控磁盘(iops和读写量)
  4. 如何在MVCsheet表单页面的后台取到页面自定义字段的值?
  5. CSS3 2D Transform
  6. OSPF协议概述(一)
  7. 使用Exchange 的SMTP连接器路由/中继邮件的设定图例
  8. ITU-RBT.656视频标准接口
  9. 【深度学习系列】基础知识、模型学习
  10. 机器学习——支持向量机SVM之非线性模型(原问题和对偶问题)