自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(27)
  • 收藏
  • 关注

原创 算法:后序遍历

题目:二叉树的后序遍历二叉树有3种遍历方式:1,前序遍历,2,中序遍历,3,后序遍历后序遍历的逻辑就是:先左子节点,再右子节点,最后跟节点。举例如图:左右子节点分别为:那咱们发现,左子节点,是一大坨啊。咋遍历呢?依然是后序遍历拆分。所以就是4-5-2-3-1代码/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * Tr

2020-09-29 21:09:30 1675

原创 算法:填充每个节点的下一个右侧节点指针 II

题目给定一个二叉树。填充它的每个 next 指针,让这个指针指向其下一个右侧节点。如果找不到下一个右侧节点,则将 next 指针设置为 NULL。初始状态下,所有 next 指针都被设置为 NULL。也就是说对于二叉树的每个节点,next为此节点同一级,的右侧的节点所以思路一目了然,用广度优先遍历。代码/*// Definition for a Node.class Node { public int val; public Node left; public No

2020-09-28 21:19:57 67

转载 算法:路径总和

题目给定一个二叉树和一个目标和,找到所有从根节点到叶子节点路径总和等于给定目标和的路径。说明: 叶子节点是指没有子节点的节点。示例:给定如下二叉树,以及目标和 sum = 22, 5 / \ 4 8 / / \ 11 13 4 / \ / \ 7 2 5 1返回:[[5,4,11,2],[5,8,4,5]]代码/** * Definition for a

2020-09-26 23:54:11 103

原创 算法:从中序与后序遍历序列构造二叉树

题目:根据一棵树的中序遍历与后序遍历构造二叉树。注意:你可以假设树中没有重复的元素。例如,给出中序遍历 inorder = [9,3,15,20,7]后序遍历 postorder = [9,15,7,20,3]返回如下的二叉树: 3 / \ 9 20 / \ 15 7思路:这个题得画图,把每个关系画出来,多画几种情况。用这个,可以写出最小的代码然后将最小代码递归,从而实现这样的图形首先,从后序遍历中取值,后续遍历的逻辑是:先左节点,后右节点,

2020-09-26 01:04:20 274

转载 算法:合并二叉树

题目:给定两个二叉树,想象当你将它们中的一个覆盖到另一个上时,两个二叉树的一些节点便会重叠。你需要将他们合并为一个新的二叉树。合并的规则是如果两个节点重叠,那么将他们的值相加作为节点合并后的新值,否则不为 NULL 的节点将直接作为新二叉树的节点。示例 1:输入:Tree 1 Tree 21 2/ \ / \3 2 1

2020-09-23 21:54:22 295

原创 算法:合并排序的数组

题目:给定两个排序后的数组 A 和 B,其中 A 的末端有足够的缓冲空间容纳 B。 编写一个方法,将 B 合并入 A 并排序。初始化 A 和 B 的元素数量分别为 m 和 n。输入:A = [1,2,3,0,0,0], m = 3B = [2,5,6], n = 3输出: [1,2,2,3,5,6]代码class Solution: def merge(self, A: List[int], m: int, B: List[int], n: int) -> No

2020-09-23 00:06:41 117

原创 算法:把二叉搜索树转换为累加树

题目:538. 把二叉搜索树转换为累加树给定一个二叉搜索树(Binary Search Tree),把它转换成为累加树(Greater Tree),使得每个节点的值是原来的节点值加上所有大于它的节点值之和。输入: 原始二叉搜索树: 5 / \ 2 13输出: 转换为累加树: 18 / \ 20 13思路搜索二叉树,左节点小于根节

2020-09-21 22:59:26 86

原创 算法:子集

题目:给定一组不含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集)。说明:解集不能包含重复的子集。例如:输入: nums = [1,2,3]输出:[ [3], [1], [2], [1,2,3], [1,3], [2,3], [1,2], []]思路其实这个思路,可以看这个代码 # for i in nums: # temp.append(i) # res.append(temp

2020-09-20 19:54:19 191

原创 算法:左叶子之和

题目:计算给定二叉树的所有左叶子之和。 3 / \ 9 20 / \ 15 7在这个二叉树中,有两个左叶子,分别是 9 和 15,所以返回 24思路初始化结果self.res从根节点开始,深度遍历。遇到左子节点,self.res += node.val左子节点的判断条件是左边的子节点,且该节点没有子节点。递归(这里有个小技巧,递归的时候,给一个code,用来区分左子节点和右子节点)代码# Definition for a binary tree

2020-09-19 20:36:20 210

原创 算法:全排列,但去除重复排列项

题目给定一个可包含重复数字的序列,返回所有不重复的全排列。输入: [1,1,2]输出:[ [1,1,2], [1,2,1], [2,1,1]]思路之前做过全排列。所以思路是,可以先全排列,获得结果 res然后再逐项比较,将不重复的项添加到最终结果集 response 中from typing import Listclass Solution: def permuteUnique(self, nums: List[int]) -> List[List[int

2020-09-18 21:04:28 655

原创 算法:字符串检查

题目:给定有效字符串 “abc”。对于任何有效的字符串 V,我们可以将 V 分成两个部分 X 和 Y,使得 X + Y(X 与 Y 连接)等于 V。(X 或 Y 可以为空。)那么,X + “abc” + Y 也同样是有效的。例如,如果 S = “abc”,则有效字符串的示例是:“abc”,“aabcbc”,“abcabc”,“abcabcababcc”。无效字符串的示例是:“abccba”,“ab”,“cababc”,“bac”。如果给定字符串 S 有效,则返回 true;否则,返回 false。

2020-09-17 22:26:47 463

原创 算法:翻转二叉树

翻转一棵二叉树。示例:输入: 4 / \ 2 7 / \ / \1 3 6 9输出: 4 / \ 7 2 / \ / \9 6 3 1解题思路:遇到问题,想想能不能把问题缩小,缩小到最小。那咱们这个题的最小算法是什么?一个 4 / \ 7 2这样的二叉树的翻转。这题就很简单了。node.left 和 node.right 互相调换即可。然后递归代码:

2020-09-16 22:43:28 115

转载 算法:早餐组合

题目:小扣在秋日市集选择了一家早餐摊位,一维整型数组 staple 中记录了每种主食的价格,一维整型数组 drinks 中记录了每种饮料的价格。小扣的计划选择一份主食和一款饮料,且花费不超过 x 元。请返回小扣共有多少种购买方案。注意:答案需要以 1e9 + 7 (1000000007) 为底取模,如:计算初始结果为:1000000008,请返回 1来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/2vYnGI著作权归领扣网络所有。商业转载请联系

2020-09-15 22:38:06 689

原创 算法:中序遍历

分析:中序遍历,就是先遍历二叉树的 左节点,再取顶节点,再取右节点。如图:那从一个最小的二叉树扩展开以后,也是一个道理:如下图,遍历顺序1-2-3-4-5-6算法:1,用stack从顶开始向左遍历,只有当前节点不为null,则装入stack,2,从stack取出顶部节点node,此节点为当前树的最左节点。将val加入res数组3,获取node的右节点。重复以上遍历退出循环条件:stack为空,node为null说明此时已经完成所有二叉树的遍历。代码# Definition for

2020-09-14 22:30:19 19683

原创 算法:leetocde79. 单词搜索

给定一个二维网格和一个单词,找出该单词是否存在于网格中。单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的字母不允许被重复使用。执行起来暂时没问题,但是提交会超时,明天再优化一下看看代码:from typing import Listclass Solution: def exist(self, board: List[List[str]], word: str) -> bool: read_t

2020-09-14 00:08:31 98

原创 算法:二叉树的层平均值

题目给定一个非空二叉树, 返回一个由每层节点平均值组成的数组。输入: 3 / \ 9 20 / \ 15 7输出:[3, 14.5, 11]题解:也就是遍历树结构,广度优先。1,用一个数组,将第一层都装进去。2,将此数组求平均值3,用当前数组的每一个元素,获取下一层的元素,装入数组中。只切当前一层的元素重复以上步骤代码# Definition for a binary tree node.# class TreeNode:# def

2020-09-12 21:27:24 236

原创 算法:组合总和 III

题目:找出所有相加之和为 n 的 k 个数的组合。组合中只允许含有 1 - 9 的正整数,并且每种组合中不存在重复的数字。说明:所有数字都是正整数。解集不能包含重复的组合。 示例 2:输入: k = 3, n = 9输出: [[1,2,6], [1,3,5], [2,3,4]]思路:又是一道组合,挺好的,书读百遍其义自见,同类型的题多做才能掌握窍门儿。同样是按照之前的思路,其实就是传说中的回溯法了。套路相同,不同的地方:递归终止条件temp之和大于n,或者k0k0的时候,有两种情

2020-09-11 21:09:47 172

原创 算法:组合总和 II

题目给定一个数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。candidates 中的每个数字在每个组合中只能使用一次。说明:所有数字(包括目标数)都是正整数。解集不能包含重复的组合。 示例 1:输入: candidates = [10,1,2,7,6,1,5], target = 8,所求解集为:[[1, 7],[1, 2, 5],[2, 6],[1, 1, 6]]题解:这个题目和上一个题目

2020-09-10 21:57:24 114

原创 算法:组合总和

题目:给定一个无重复元素的数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。candidates 中的数字可以无限制重复被选取。说明:所有数字(包括 target)都是正整数。解集不能包含重复的组合。 示例 1:输入:candidates = [2,3,6,7], target = 7,所求解集为:[[7],[2,2,3]]题解:遇到问题不要懵,不要懵,话说,这道题,真的,看好几次都觉得有点懵逼。

2020-09-09 21:01:21 315

原创 算法:组合

题目:给定两个整数 n 和 k,返回 1 … n 中所有可能的 k 个数的组合。示例:输入: n = 4, k = 2输出:[[2,4],[3,4],[2,3],[1,2],[1,3],[1,4],]题解:直接思路,其实就是从数组【1…n+1】中不断取出元素,一共取k个,组成的所有可能。(区别于全排列的时候,全排列中 [1,2] [2,1] 是两个不同的元素,而此处是相同的元素)画图:如果最简单的情况,n=4,k=2代码可以这么写:src = [i for i in ran

2020-09-08 21:24:12 238

原创 算法:前 K 个高频元素

题目:给定一个非空的整数数组,返回其中出现频率前 k 高的元素。例如输入: nums = [1,1,1,2,2,3], k = 2输出: [1,2]题解:思路还是比较清晰的1,先初始化一个map,通过遍历,将每个元素的次数统计出来2,取次数中的前k个元素。关键是第二步怎么取。如果通过排序来取的话,时间复杂度肯定是相对高一些。官网解法是通过大顶堆来取值。堆的算法可以自己写,也可以用python自带的heapq模块。另外吧,我觉得也可以直接取。先取最大的,然后将其从map中pop出来。然后取下

2020-09-07 21:24:20 150

原创 算法:广度优先

说明:其实,广度优先这种算法是有套路的。具体来说,就是用每一层的节点,去获取下一层的节点,然后将所有下一层的节点存到一个list中。继续用list中的节点,去获取下一层的节点。那这就是一个层层遍历。这种遍历的终止条件,就是当list为空。用一个例子来练手说明一下:题目:二叉树的层次遍历给定一个二叉树,返回其节点值自底向上的层次遍历。也就是先返回最底层,然后返回次底层。例如: 3 / \ 9 20 / \ 15 7返回的结果为:[ [15,7],

2020-09-06 14:21:10 116

原创 算法:全排列的升级版

获取全排列的第k个排列给出集合 [1,2,3,…,n],其所有元素共有 n! 种排列。按大小顺序列出所有排列情况,并一一标记,当 n = 3 时, 所有排列如下:"123""132""213""231""312""321"给定 n 和 k,返回第 k 个排列。题解:看题不言而喻,全排列,选第K项。对 n! 全排列的代码先写出来。方法有回溯和广度优先两种,但按题目,还需要排序,所以用回溯法来做。class Solution: def getPermutation(self,

2020-09-05 15:41:10 108

原创 算法:二叉树的所有路径

给定一个二叉树,返回所有从根节点到叶子节点的路径。例如:示例:输入: 1 / \2 3 \ 5输出: [“1->2->5”, “1->3”]题解:二叉树的深度优先遍历。遍历到没有左右节点的时候,将整个路径append到 结果集中。# class TreeNode:# def __init__(self, x):# self.val = x# self.left = None# self

2020-09-04 22:44:42 188

转载 算法:函数的独占时间

昨晚通宵发版,导致今天状态很差。思路有点乱……这个题目来自LeetCode 636. 函数的独占时间题目不复制了题解:这个解法,巧妙的地方在于casttime的运用。这样,栈顶元素运行的时间,就相当于 当前时间 - 已结束进程消耗的时间 - 该进程开始的时间。当前结束进程运行的时间,相当于当前进程开始运行的时间 – 一直到当前时间。class Solution: def exclusiveTime(self, n: int, logs: List[str]) -> List[int

2020-09-03 23:41:30 165

原创 算法: 对称二叉树

题目:例如,二叉树 [1,2,2,3,4,4,3] 是对称的。 1 / \ 2 2 / \ / \3 4 4 3但是下面这个 [1,2,2,null,3,null,3] 则不是镜像对称的: 1 / \ 2 2 \ \ 3 3思路:就是以根节点为中心点,左右对称。那我们可以递归对比,最左边的点和最右边的点 val 相同。代码一看就明白了,如下class TreeNode: def __init__(self, x

2020-09-02 23:34:14 71

原创 算法:每日温度

题目:请根据每日 气温 列表,重新生成一个列表。对应位置的输出为:要想观测到更高的气温,至少需要等待的天数。如果气温在这之后都不会升高,请在该位置用 0 来代替。例如,给定一个列表 temperatures = [73, 74, 75, 71, 69, 72, 76, 73],你的输出应该是 [1, 1, 4, 2, 1, 1, 0, 0]。其实题意就是:找到列表中,比当前项大的,最近的后一项。两种解法:一:1,以当前项为起点,开始遍历之后的项。2,遇到比当前大的,计算 index 的差,跳出循

2020-09-01 22:20:31 302

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除