剑指offer
liubeiandcaocao
这个作者很懒,什么都没留下…
展开
-
剑指offer51 数组中的逆序对数量,归并排序的使用
class Solution: def reversePairs(self, nums: List[int]) -> int: if not nums: return 0 def mergesort(s,e): if s==e: #递归终止条件:只剩下1个元素时,一定是有序的 return m = s+(e-s)//2 mergeso原创 2020-09-07 10:48:10 · 151 阅读 · 0 评论 -
最长上升子序列,经典
class Solution: def lengthOfLIS(self, nums: List[int]) -> int: 方法一,动态规划 if not nums: return 0 dp = [1]*len(nums)#dp【0】以0位结尾的,最长上升子序列长度为1 for i in range(1,len(nums)): for j in range(i):原创 2020-09-06 23:02:12 · 162 阅读 · 0 评论 -
剑指offer46 把数字翻译成字符串 多种思路,必看 动态规划
动态规划-1dp【i】表示以i索引结尾时,翻译的方法数class Solution: def translateNum(self, num: int) -> int: string = str(num)#将数字转成str方便索引 dp = [0]*(len(string))###区别1 dp[0] = 1 #dp【i】的含义是第i位为止,有多少种翻译方法;dp[0]第0位为止,有1种翻译方法; #如果dp[i原创 2020-09-06 15:50:02 · 132 阅读 · 0 评论 -
215 数组中的第k个最大元素,重新学习记录快速选择
class Solution: def findKthLargest(self, nums: List[int], k: int) -> int: def _partion(nums,left,right): rand_index = random.randint(left,right)#随机化切分元素 # randint 是包括左右区间的 nums[left],nums[rand_index] = num原创 2020-08-26 12:14:49 · 119 阅读 · 0 评论 -
二分法,2球之间的最大磁力;即最大最小值问题
求最小磁力的最大值能是多大class Solution: def maxDistance(self, position: List[int], m: int) -> int: position.sort()#需要先排序,才能求最大边界值 left = min((position[i+1] - position[i]) for i in range(len(position) - 1))#最小边界值 right = position[-1]-p原创 2020-08-16 18:35:52 · 194 阅读 · 0 评论 -
108将有序数组转为二叉搜索树(高度平衡搜索二叉树)
首先记起来二叉搜索树的概念,所有左右子树节点,左<中<右。同时要求满足高度差不超过1,则选择中点为根节点。# Definition for a binary tree node.# class TreeNode:# def __init__(self, x):# self.val = x# self.left = None# ...原创 2020-03-03 10:22:06 · 139 阅读 · 0 评论 -
剑指 Offer 55 - II. 平衡二叉树
输入一棵二叉树的根节点,判断该树是不是平衡二叉树;二叉树中任意节点的左右子树的深度相差不超过1,则是平衡二叉树回顾递归求深度的方案,是先求得左右子树的深度,然后进一步得到当前节点的深度,即先左右子树,再根节点;可以直接加入一个全局变量记录当前是否平衡,并额外引入一个逻辑来比较子树的深度;BFS迭代求深度的算法,是当前节点从上到下所在的层数,每个节点并不知道自己的深度(从下往上,从叶子节点到自身)class Solution: def isBalanced(self, root: TreeNo原创 2020-08-15 10:29:38 · 117 阅读 · 0 评论 -
leetcode(104)二叉树的最大深度 剑指 Offer 55 - I. 二叉树的深度 我可太喜欢BFS遍历的方法了,一定要掌握
给定一个二叉树,找出其最大深度。二叉树的深度为根节点到最远叶子节点的最长路径上的节点数。说明: 叶子节点是指没有子节点的节点。两种方式:递归求解和非递归(迭代)求解方法一class Solution: def maxDepth(self,root): """ :type root: TreeNode :rtype: int ""...原创 2020-02-29 17:26:15 · 169 阅读 · 0 评论 -
剑指 Offer 54. 二叉搜索树的第k大节点 用到了莫里斯遍历
方法1:二叉搜索树的性质,中序遍历左中右是升序的;使用中序遍历的变形,右中左,则第k个数就是第k大节点class Solution: def kthLargest(self, root: TreeNode, k: int) -> int: res = [] stack =[] while stack or root: while root: stack.append(root)原创 2020-08-14 13:28:21 · 172 阅读 · 0 评论 -
树的遍历总结 DFS+BFS+n叉树的遍历
关于树的遍历,前序,中序,后序,各有3种方法。递归;迭代;莫里斯这里进行总结:①递归总结:递归只需注意一点,函数调用是小括号不是中括号,preorder(root)√ preorder[root]×前序class Solution: def preorderTraversal(self,root): def preorder(node): return [node.val]+preorder(node.left)+preorder(node.right) if n原创 2020-08-13 15:56:49 · 310 阅读 · 0 评论 -
前序中序的莫里斯遍历
记一下这个题解前序中序的莫里斯遍历原创 2020-08-13 12:38:12 · 224 阅读 · 0 评论 -
剑指 Offer 53 - I. 在排序数组中查找数字 I 剑指 Offer 53 - II. 0~n-1中缺失的数字
剑指 Offer 53 - I. 在排序数组中查找数字 I给定排序好的上升数组,找出数组中目标值出现的次数;这种排序好的数组,找目标值在不在,出现的次数,就用二分法;示列:输入: nums = [5,7,7,8,8,10], target = 8输出: 2脑海里就推一遍[5,7,7,8,8,10], targrt=8class Solution: def search(self, nums: List[int], target: int) -> int: def原创 2020-08-09 13:21:33 · 126 阅读 · 0 评论 -
剑指 Offer 50. 第一个只出现一次的字符 字典加k,v的学习
class Solution:#将计数字典改为[index,cnt]这样的kv组合字典;也就是说字典的val并不一定是一个值,可以是个列表;dict[key][index]即可 def firstUniqChar(self, s: str) -> str: d = {} #字符串是可以当做列表遍历的 for i, c in enumerate(s): if c in d: #在不在字典,是看这个值是不是keys,字典.原创 2020-08-04 22:57:58 · 129 阅读 · 0 评论 -
剑指 Offer 49. 丑数 小根堆的用法,类似BFS
题意,丑数定义为因子只有2,3,5;1也是丑数,给定n,返回第n个丑数用小根堆,从小到大的输出丑数class Solution: def nthUglyNumber(self, n: int) -> int:#方法一 小根堆,类似BFS的思路,添加一个,考虑当前元素 v = {1} q = [1] res = 0 for i in range(n): res = heapq.heappop(q)原创 2020-08-04 15:59:11 · 100 阅读 · 0 评论 -
剑指 Offer 48. 最长不含重复字符的子字符串 滑动窗口思想的算法题
本题题意:给定一个字符串,找出其中最长的子字符串,且子字符串中不含重复字符;(子字符串要求连续,子序列不要求连续)滑动窗口,定义2个指针,维护窗口的起点和终点,根据当前窗口是否满足要求来进行不同的处理#滑动窗口思想;通常做法是①维护双指针代表窗口起点和终点,②然后根据当前窗口是否满足要求进行不同的处理class Solution: def lengthOfLongestSubstring(self, s: str) -> int: start = 0 #窗口的起点原创 2020-08-03 10:53:45 · 180 阅读 · 0 评论 -
剑指offer47礼物的最大价值
和剑指offer46一样,动态规划的题目,经典必看必学必会class Solution: def maxValue(self, grid: List[List[int]]) -> int: rows , cols = len(grid),len(grid[0]) for r in range(rows): for c in range(cols): premax=0#表示先前的最大值,初始化为0原创 2020-08-01 20:13:34 · 114 阅读 · 0 评论 -
剑指offer46 把数字翻译成字符串
动态规划的很经典的题目,原始方法和使用空间优化的方法,必看必学必会class Solution: def translateNum(self, num: int) -> int:#方法一 s = str(num)#整数转为字符串,才能用索引获取每个值 dp = [0]*len(s) #dp[i]表示以第i位字符为结尾的,翻译方法有多少种 dp[0]=1 for i in range(1,len(s)):原创 2020-08-01 19:47:19 · 113 阅读 · 0 评论 -
剑指offer45 把数组排成最小的数
输入一个非负整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个;数字大小和字典序的大小都不行,必须满足22交换后str(a)+str(b)<str(b)+str(a)class Solution: def minNumber(self, nums: List[int]) -> str:方法一 经典快速排序的实现,实现 str(a)+str(b)<str(b)+str(a) nums = list(map(str,nums))#ma原创 2020-07-30 22:10:17 · 76 阅读 · 0 评论 -
剑指offer 43 1~n整数中1出现的次数
题意是给定n,输出1~n个数中,位数上有1的在每个数出现的次数和;比如n=12,则位数上有1的有1,10,11,12,一共4个,但统计的是1出现的次数,则是5次,11出现了2次1;思路是:统计一个数,其某位上出现1的总次数,然后将该数每一位上的总次数加起来就是最后的总次数规律题,当该位是0时,则出现的总次数是highdigst;当该位是0时,则出现的总次数是highdigst+low+1; 当该位是0时,则出现的总次数是(high+1)*digstwhile high != 0 or cur !原创 2020-07-29 14:41:05 · 114 阅读 · 0 评论 -
剑指offer42 连续子数组的最大和 经典动态规划题目
给定一个数组,求数组元素中的最大和,且要求元素是连续的;所以最大和要么是加上当前的元素,要么是从当前元素开始class Solution: def maxSubArray(self, nums: List[int]) -> int:] #动态规划的经典题目 res = float('-inf') #初始化最终结果为负无穷,因为数组可能全是负数 smax = 0 for i in nums: smax原创 2020-07-27 19:26:28 · 91 阅读 · 0 评论 -
数据流中的中位数;大根堆和小根堆的使用方法教学案例;剑指offer40 最小的k个数也是大根堆实现
最小堆最大堆,给定未排序的数组,找到中位数rom heapq import *class MedianFinder: def __init__(self): self.A = [] # 小顶堆,保存较大的一半 self.B = [] # 大顶堆,保存较小的一半 def addNum(self, num: int) -> None: if len(self.A) != len(self.B): heappush(原创 2020-05-30 20:15:30 · 137 阅读 · 0 评论 -
剑指offer40最小的k个数 使用快速选择来写,经典;用215题数组中的第k个最大元素的方法再写一遍快速选择
class Solution: def getLeastNumbers(self, arr: List[int], k: int) -> List[int]: if k==0: return [] def partition(s,e): if s>=e: #递归出口,此时不需要额外划分 return pivot = arr[s] #定义基线点原创 2020-07-26 16:50:54 · 125 阅读 · 0 评论 -
剑指offer38 字符串的排列 字典序的排列,贪心算法
class Solution: def permutation(self, s: str) -> List[str]: res = [] def getNext(s): for i in range(len(s)-1)[::-1]: #abdc 0123 012 if s[i] < s[i+1]:#从后往前找第一个小于其后一个字符的字符i,例如dc不满足 bd满足,i=b .原创 2020-07-23 23:22:09 · 128 阅读 · 0 评论 -
剑指offer34 二叉树中和为某一值的路径 递归+迭代
# Definition for a binary tree node.# class TreeNode:# def __init__(self, x):# self.val = x# self.left = None# self.right = Noneclass Solution: def pathSum(self, root: TreeNode, sum: int) -> List[List[int]]:#方法一 .原创 2020-07-20 14:59:59 · 137 阅读 · 0 评论 -
剑指offer27 二叉树的镜像 递归+迭代
设计一个函数,输入一个二叉树,输出其镜像root=[4,2,7,1,3,6,9]输出[4,7,2,9,6,3,1]递归+迭代# Definition for a binary tree node.# class TreeNode:# def __init__(self, x):# self.val = x# self.left = None# self.right = Noneclass Solution: def mir原创 2020-07-19 16:58:28 · 112 阅读 · 0 评论 -
剑指offer32-Ⅰ Ⅱ Ⅲ 关于打印二叉树的题,多看几遍其实很简单
BFS的好例子,使用双端队列的数据结构解决BFS# Definition for a binary tree node.# class TreeNode:# def __init__(self, x):# self.val = x# self.left = None# self.right = Noneimport collectionsclass Solution: def levelOrder(self, root: Tr.原创 2020-07-17 11:29:13 · 103 阅读 · 0 评论 -
剑指offer 剪绳子
给定长度为n的绳子,剪成m段,具体m为多少就是算法要考虑的,反正m>1,即至少要剪成2段;使剪成的每一段的长度乘积最大思考:对于n<=3,至少要剪成2段,则长度必然缩小;即长度为2,1+1=2,11=1;长度为3,1+2=3,12=3;但对于长度4就不一定,1+3,2+2都行;使用字典,记忆化搜索class Solution(object): def cuttingRope(self,n): if n<=3: return n-1 memo = {} def c原创 2020-06-27 12:55:45 · 91 阅读 · 0 评论 -
剑指offer-数组中重复的数字
本题和287题类似,寻找重复的数字,但据博主观察,287题定义的范围是1~n,给定数组长度为n+1,即给定长度为4的数组,可取的值的范围为1,2,3,那么必然还有一个数,是重复的。该题,定义的范围是0~n-1,给定数组长度为n,即给定长度为4的数组,可取值的范围0,1,2,3,那么不一定存在重复的数字。就不能用287的方法,因为可取值0的存在。本题解法,利用范围0~n-1,即索引值,将对应的索引上放置对应的数字,如果不相等,就交换过来放置,如果相等,就放着。如果又找到一个,和要放置的索引上的值相等,那么原创 2020-06-17 11:31:25 · 92 阅读 · 0 评论