![](https://img-blog.csdnimg.cn/20201014180756913.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
Leetcode
大叔爱学习.
所谓至明,不过至专。
展开
-
剑指offer 刷题 二十六 字符串(20 67)
文章目录剑指 Offer 20. 表示数值的字符串剑指 Offer 67. 把字符串转换成整数剑指 Offer 20. 表示数值的字符串打补丁打到绝望def isNumber(self, s: str) -> bool: m = [str(i) for i in range(10)] m += ['+', '-', 'e', 'E', '.'] res = s.strip() for cha in res:原创 2022-01-16 21:24:21 · 2497 阅读 · 0 评论 -
剑指offer 刷题 二十五 模拟(29 31)
文章目录剑指 Offer 29. 顺时针打印矩阵剑指 Offer 31. 栈的压入、弹出序列剑指 Offer 29. 顺时针打印矩阵剑指 Offer 31. 栈的压入、弹出序列原创 2022-01-16 16:35:40 · 159 阅读 · 0 评论 -
剑指offer 刷题 二十四 数学(14-I 57-II 62)
文章目录剑指 Offer 14- I. 剪绳子剑指 Offer 57 - II. 和为s的连续正数序列剑指 Offer 14- I. 剪绳子直接不会。看2个大佬的思路和代码吧:下面是我根据大佬思路,自己写的代码:def cuttingRope(self, n: int) -> int: if n <=3: return n - 1 else: a = n // 3 b = n % (3 * a)原创 2022-01-12 22:51:33 · 171 阅读 · 0 评论 -
剑指offer 刷题 二十三 数学(39 66)
文章目录剑指 Offer 39. 数组中出现次数超过一半的数字剑指 Offer 66. 构建乘积数组剑指 Offer 39. 数组中出现次数超过一半的数字写了一个快排,时间超了。这题如果是考试,我还是用哈希比较保险。哈希的时间复杂度是O(n),快排是O(nlogn)。def majorityElement(self, nums: List[int]) -> int: def quicksort(left, right, nums): if left &g原创 2022-01-11 13:36:25 · 256 阅读 · 0 评论 -
剑指offer 刷题 二十二 位运算(56-I 56-II)
剑指 Offer 56 - I. 数组中数字出现的次数一个整型数组 nums 里除两个数字之外,其他数字都出现了两次。请写程序找出这两个只出现一次的数字。要求时间复杂度是O(n),空间复杂度是O(1)。插播知识点:Python 中 (&,|)和(and,or)之间的区别想了半天,不会,直接看大啦的思路和答案吧:def singleNumber(self, nums: List[int]) -> List[int]: x = 0 for num in nums:原创 2022-01-10 06:10:59 · 213 阅读 · 0 评论 -
Leetcode 专题训练 递归和分治(五)
315. 计算右侧小于当前元素的个数493. 翻转对53. 最大子数组和原创 2022-01-09 18:15:11 · 104 阅读 · 0 评论 -
Leetcode 专题训练 递归和分治(四)
文章目录剑指 Offer 51. 数组中的逆序对215. 数组中的第K个最大元素剑指 Offer 51. 数组中的逆序对暴力解法,时间超时:def reversePairs(self, nums: List[int]) -> int: count = 0 for i in range(len(nums)-1): for j in range(i+1, len(nums)): if nums[i] >原创 2022-01-07 16:37:17 · 3742 阅读 · 0 评论 -
Leetcode 专题训练 递归和分治(三)
文章目录深度理解递归-练习题912. 排序数组归并排序快速排序深度理解递归-练习题912. 排序数组归并排序尝试的复习了昨天的归并排序,重新理解了为什么要用while i <= mid 或者while j <= right对剩下的数组进行合并。而不能直接拼接,那样会有问题。另外也理解了为什么不是nums=temp,而是nums[left:right+1]=temp。因为在归并的时候,left和right都是原数组的一部分。我们只能修改一部分的数组序列。def sortArray(se原创 2022-01-07 14:17:24 · 586 阅读 · 0 评论 -
Leetcode 专题训练 递归和分治(二)
文章目录深入理解递归 - 1归并排序深入理解递归 - 1归并排序912. 排序数组给你一个整数数组 nums,请你将该数组升序排列。原创 2022-01-06 21:53:21 · 3130 阅读 · 0 评论 -
Leetcode 专题训练 递归和分治(一)
文章目录简介分而治之的算法设计思想递归与分治递归函数的设计思想:分而治之(减而治之)自顶向下地解决问题为什么需要使用栈?拆分的时候「先走出去」,合并的时候「再走回来」总结自顶向下与自底向上使用「递归」与「循环」实现的求阶乘函数对比递推与递归总结与练习简介分而治之的算法设计思想递归与分治递归函数的设计思想:分而治之(减而治之)自顶向下地解决问题为什么需要使用栈?这一步在我看剑指offer的时候,也理解到了。拆分的时候「先走出去」,合并的时候「再走回来」总结自顶向下与自底向原创 2022-01-04 15:21:13 · 947 阅读 · 0 评论 -
剑指offer 刷题 二十一 位运算(15 65)
剑指 Offer 15. 二进制中1的个数编写一个函数,输入是一个无符号整数(以二进制串的形式),返回其二进制表达式中数字位数为 ‘1’ 的个数(也被称为 汉明重量).)。这题在上一章做过类似的处理,所以一下子就写出来了。我的代码风格也和大佬越来越接近了。写的多了,自然就有成为大佬的样子的趋势了。def hammingWeight(self, n: int) -> int: count = 0 while n: if n & 1原创 2022-01-01 18:40:15 · 540 阅读 · 0 评论 -
剑指offer 刷题 二十 分治(07 16 33)
剑指 Offer 07. 重建二叉树输入某二叉树的前序遍历和中序遍历的结果,请构建该二叉树并返回其根节点。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。这道题要用到递归的思想,用pre找到根,用in找到左右两个子树。下面是我画的示意图,很好看哟。...原创 2021-12-31 17:56:50 · 745 阅读 · 0 评论 -
剑指offer 刷题 十九 搜索与回溯(64 68-I 68-II)
剑指 Offer 64. 求1+2+…+n求 1+2+…+n ,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)。我用了if的代码: def sumNums(self, n: int) -> int: if n == 1: return 1 return n + self.sumNums(n-1)下面是大佬没有用if的思路和代码。。。。根据大佬思路,修改的代码,写的不对。。。def原创 2021-12-28 11:02:08 · 909 阅读 · 0 评论 -
剑指offer 刷题 十八 搜索与回溯(55-I 55-II)
剑指 Offer 55 - I. 二叉树的深度输入一棵二叉树的根节点,求该树的深度。从根节点到叶节点依次经过的节点(含根、叶节点)形成树的一条路径,最长路径的长度为树的深度。自己写的DFS:def maxDepth(self, root: TreeNode) -> int: res, path = [], [] def dfs(root, path): if not root: return path.append原创 2021-12-27 15:22:43 · 80 阅读 · 0 评论 -
剑指offer 刷题 十七 排序(40 41)
剑指 Offer 40. 最小的k个数输入整数数组 arr ,找出其中最小的 k 个数。例如,输入4、5、1、6、2、7、3、8这8个数字,则最小的4个数字是1、2、3、4。这个题我拿到手,第一反应就是一个排序,最后返回前k个就可以。当时想用快速排序,但是发现已经不会写了,尴尬。于是从网上搜索了快速排序的讲解,我发到下面。快速排序:代码自己写的:def getLeastNumbers(self, arr: List[int], k: int) -> List[int]:原创 2021-12-26 18:51:55 · 82 阅读 · 0 评论 -
剑指offer 刷题 十六 排序(45 61)
剑指 Offer 45. 把数组排成最小的数输入一个非负整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。非常冗余的代码。我自己写的,但是题目理解错了,我把每个数字都拆分了,题目的要求是不能拆分。。。所以[20,1],我的代码输出102.答案是120.。。。def minNumber(self, nums: List[int]) -> str: li = [] for num in nums: if 10原创 2021-12-26 10:32:03 · 377 阅读 · 0 评论 -
剑指offer 刷题 十五 搜索与回溯(34 36 54)
剑指 Offer 34. 二叉树中和为某一值的路径给你二叉树的根节点 root 和一个整数目标和 targetSum ,找出所有 从根节点到叶子节点 路径总和等于给定目标和的路径。叶子节点 是指没有子节点的节点。尝试写,没写出来的DFS:def pathSum(self, root: TreeNode, target: int) -> List[List[int]]: def dfs(root, li): li.append(root.val)原创 2021-12-25 19:13:14 · 347 阅读 · 0 评论 -
剑指offer 刷题 十四 搜索与回溯 (12 13)
剑指 Offer 12. 矩阵中的路径原创 2021-12-25 08:49:01 · 268 阅读 · 0 评论 -
剑指offer 刷题 十三 双指针(21 57 58-I)
剑指 Offer 21. 调整数组顺序使奇数位于偶数前面输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有奇数在数组的前半部分,所有偶数在数组的后半部分。暴力法:def exchange(self, nums: List[int]) -> List[int]: li = [] for i in nums: if i % 2 == 0: li.append(i) else: li.insert(0, i原创 2021-12-22 16:23:37 · 509 阅读 · 0 评论 -
剑指offer 刷题 十二 双指针(25 52)
剑指 Offer 25. 合并两个排序的链表输入两个递增排序的链表,合并这两个链表并使新链表中的节点仍然是递增排序的。双指针:def mergeTwoLists(self, l1: ListNode, l2: ListNode) -> ListNode: cur, cur1, cur2 = ListNode(), l1, l2 res = cur while cur1 or cur2: if cur1 and cur2 a原创 2021-12-21 17:04:39 · 603 阅读 · 0 评论 -
剑指offer 刷题 十一 双指针(18 22)
剑指 Offer 18. 删除链表的节点给定单向链表的头指针和一个要删除的节点的值,定义一个函数删除该节点。返回删除后的链表的头节点。注意:此题对比原题有改动双指针:def deleteNode(self, head: ListNode, val: int) -> ListNode: cur = head.next pre = head if pre.val == val: return cur while cur.next:原创 2021-12-21 14:40:37 · 429 阅读 · 0 评论 -
剑指offer 刷题 十 动态规划(46 48)
剑指 Offer 46. 把数字翻译成字符串给定一个数字,我们按照如下规则把它翻译为字符串:0 翻译成 “a” ,1 翻译成 “b”,……,11 翻译成 “l”,……,25 翻译成 “z”。一个数字可能有多个翻译。请编程实现一个函数,用来计算一个数字有多少种不同的翻译方法。动态规划:def translateNum(self, num: int) -> int: dp = [] nums = str(num) dp.append(1)原创 2021-12-21 13:13:56 · 181 阅读 · 0 评论 -
剑指offer 刷题 九 动态规划(42 47)
剑指 Offer 42. 连续子数组的最大和输入一个整型数组,数组中的一个或连续多个整数组成一个子数组。求所有子数组的和的最大值。要求时间复杂度为O(n)。动态规划:def maxSubArray(self, nums: List[int]) -> int: dp = [] dp.append(nums[0]) for i in range(1, len(nums)): if dp[i-1] > 0:原创 2021-12-20 21:46:53 · 71 阅读 · 0 评论 -
剑指offer 刷题 八 动态规划(10-I 10-II 63)
剑指 Offer 10- I. 斐波那契数列写一个函数,输入 n ,求斐波那契(Fibonacci)数列的第 n 项(即 F(N))。斐波那契数列的定义如下:斐波那契数列由 0 和 1 开始,之后的斐波那契数就是由之前的两数相加而得出。答案需要取模 1e9+7(1000000007),如计算初始结果为:1000000008,请返回 1。递归法:def fib(self, n: int) -> int: if n == 1 or n == 0: return n原创 2021-12-17 21:53:02 · 90 阅读 · 0 评论 -
算法通关40讲 笔记十一(动态规划)
面试常考题型。动态规划就是动态递推。递归+记忆化,时间复杂度是O(n)的。我们做递推的时候,不再从后往前推,而是从前往后推。原创 2021-12-17 17:24:47 · 761 阅读 · 0 评论 -
剑指offer 刷题 三 字符串(05 58)
剑指 Offer 05. 替换空格请实现一个函数,把字符串 s 中的每个空格替换成"%20"。def replaceSpace(self, s: str) -> str: new_s = '' for cha in s: if cha == ' ': new_s += '%20' else: new_s += cha return new原创 2021-12-09 11:12:06 · 65 阅读 · 0 评论 -
剑指offer 刷题 二 链表(06 24 35)
剑指 Offer 06. 从尾到头打印链表输入一个链表的头节点,从尾到头反过来返回每个节点的值(用数组返回)。迭代def reversePrint(self, head: ListNode): cur = head li = [] while cur: li.append(cur.val) cur = cur.next li.reverse() return li递归:原创 2021-12-09 10:16:02 · 65 阅读 · 0 评论 -
剑指offer 刷题 七 搜索与回溯(26 27 28)
剑指 Offer 26. 树的子结构输入两棵二叉树A和B,判断B是不是A的子结构。(约定空树不是任意一个树的子结构)B是A的子结构, 即 A中有出现和B相同的结构和节点值。递归:def isSubStructure(self, A: TreeNode, B: TreeNode) -> bool: def recur(A, B): if not B: return True if not A or A.val != B.val:原创 2021-12-15 22:40:52 · 601 阅读 · 0 评论 -
剑指offer 刷题 六 搜索与回溯(32-I 32-II 32-III)
剑指 Offer 32 - I. 从上到下打印二叉树从上到下打印出二叉树的每个节点,同一层的节点按照从左到右的顺序打印。BFS:def levelOrder(self, root: TreeNode) -> List[int]: if not root: return [] else: q.append(root) q = [] li = [] while q: r = q.pop(0)原创 2021-12-15 10:32:01 · 260 阅读 · 4 评论 -
剑指offer 刷题 五 查找算法(中等)(04 11 50)
剑指 Offer 04. 二维数组中的查找在一个 n * m 的二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个高效的函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。迭代法:def findNumberIn2DArray(self, matrix: List[List[int]], target: int) -> bool: if matrix == []: return False row = l原创 2021-12-13 23:29:30 · 404 阅读 · 0 评论 -
剑指offer 刷题 四 查找算法(03 53-I 53-II)
剑指 Offer 03. 数组中重复的数字找出数组中重复的数字。在一个长度为 n 的数组 nums 里的所有数字都在 0~n-1 的范围内。数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。哈希def findRepeatNumber(self, nums: List[int]) -> int: dic = {} for num in nums: if num not in d原创 2021-12-10 17:33:02 · 376 阅读 · 0 评论 -
剑指offer 刷题 一 栈与队列(09 30)
剑指 Offer 09. 用两个栈实现队列用两个栈实现一个队列。队列的声明如下,请实现它的两个函数 appendTail 和 deleteHead ,分别完成在队列尾部插入整数和在队列头部删除整数的功能。(若队列中没有元素,deleteHead 操作返回 -1 )class CQueue(object): def __init__(self): self.s1 = list() self.s2 = list() def appendTail(sel原创 2021-11-15 20:39:55 · 422 阅读 · 0 评论 -
算法通关40讲 笔记十(位运算)
1s为全部都为1的数字。实战191. 位1的个数https://leetcode-cn.com/problems/number-of-1-bits/231. 2 的幂https://leetcode-cn.com/problems/power-of-two/比特位计数https://leetcode-cn.com/problems/counting-bits/原创 2021-11-03 22:01:39 · 78 阅读 · 0 评论 -
算法通关40讲 笔记九(字典树)
实际存储的结构实战原创 2021-11-02 22:15:34 · 101 阅读 · 0 评论 -
算法通关40讲 笔记八(剪枝 二分查找)
剪枝:是在搜索中经常用到的优化策略,它与现实结合很紧,几乎是搜索中必要的手段。人在下棋时候,想的步骤越多,相似于计算机的递归能力越强。在实际生活中,中国象棋,为什么我们是当头炮,马儿跳。其实已经是根据历史经验对很多其他的步骤进行了剪枝。就好像我们没有一开始就把老帅出动的。实战51. N 皇后https://leetcode-cn.com/problems/n-queens/N皇后 IIhttps://leetcode-cn.com/problems/n-queens-ii/原创 2021-10-21 08:57:55 · 102 阅读 · 0 评论 -
算法通关40讲 笔记七(贪心 广度优先BFS 深度优先DFS)
贪心算法只顾当前最优,贪心算法在很多情况下,是不适用的。生活中的实际问题,不能处处只看眼前。举例:最少纸币问题当问题可以拆分成子问题,子问题有最优解时,可以用贪心算法。这种子问题最优解成为最优子结构。动态规划就是子问题不一定选择最优解,而是多选几种可能,存起来所有可能的解。贪心算法无法回退,动态规划保存了之前的结果,有回退的功能。实战122. 买卖股票的最佳时机 IIhttps://leetcode-cn.com/problems/best-time-to-buy-and-sell-原创 2021-10-19 23:03:53 · 691 阅读 · 0 评论 -
算法通关40讲 笔记六(递归 分治)
递归 :Recursion 函数自己调自己(需要有终止条件)分治:divide & Conquer递归代码模版Recursion terminator:终止条件,放在最上面process logic:在当前这一层,需要的操作是什么Drill down:往下一层递归,调自己本身,level+1,参数也会通过process有一些改变。当下一层解决完回来,就回到这个位置。有时候有返回值,有时候没有返回值,当没有返回值的时候,其实有一部分参数在下一层已经被改变了。reverse curre原创 2021-10-18 21:26:01 · 86 阅读 · 0 评论 -
算法通关40讲 笔记五(树 图 二叉树遍历)
树,二叉树,二叉搜索树图树和链表的联系链表是next连接实际上,树是一个节点出2个next节点,左节点和右节点。父亲节点,儿子节点,兄弟节点。树本身是分层的,比如层次遍历BFS。完全二叉树图:最短路径,最短时间,费用最低等等。二叉搜索树最坏情况O(n),就是没有左子树,只有右子树,就变成了一条长长的链了。每次都去右边找。就和链表一样了。实战98. 验证二叉搜索树https://leetcode-cn.com/problems/validate-binary-se原创 2021-10-18 19:43:29 · 180 阅读 · 0 评论 -
算法通关40讲 笔记四(映射 集合 哈希表)
映射(Map):集合(Set):解决 hashcollision 哈希碰撞 问题,lies和foes在9的位置重合了,在9这个位置放一个链表,既拉链法。List和Map,Set对比HashMap时间复杂度一般都很低,但是TreeMap一般是对于有序的数据来说的。实战242. 有效的字母异位词https://leetcode-cn.com/problems/valid-anagram/...原创 2021-10-17 09:33:49 · 74 阅读 · 0 评论 -
算法通关40讲 笔记三(堆栈 队列 优先队列)
堆栈(stack): 也可以叫栈。但是不能叫堆,堆是heap。先入后出 First in last out(FILO)队列(Queue): 先入先出Fisrt in First out(FIFO)实战20. 有效的括号https://leetcode-cn.com/problems/valid-parentheses/description/方法1: 比我之前写的简介方法2:这样的时间复杂度要比上面的高实战21. 用栈实现队列https://leetcode-cn.com/原创 2021-10-14 23:12:02 · 135 阅读 · 0 评论