![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
Leecode
zkhong07
这个作者很懒,什么都没留下…
展开
-
颜色分类 --java 记录
给定一个包含红色、白色和蓝色,一共 n 个元素的数组,原地对它们进行排序,使得相同颜色的元素相邻,并按照红色、白色、蓝色顺序排列。此题中,我们使用整数 0、 1 和 2 分别表示红色、白色和蓝色。注意:不能使用代码库中的排序函数来解决这道题。一次循环,设置 2 个索引分别记录 red =0和blue=length的位子,1个索引i记录遍历的位子。遇到0则放到red索引位子,red +...原创 2019-10-29 11:24:36 · 150 阅读 · 0 评论 -
将有序数组转换为二叉搜索树 --java记录
递归建树数组时一个有序的,那么以中间数为跟节点建树,左右两边节点数是相同的,就可以分为两个数组,左边数组为根节点左子树(都比它小),右边数组为根节点右子树(都比它大)。递归依次取中间节点进行建树,那么最后建成的树既平衡又符合二叉搜索树class Solution { public TreeNode sortedArrayToBST(int[] nums) { if(...原创 2019-10-25 22:26:17 · 211 阅读 · 0 评论 -
平衡二叉树 --java记录
给定一个二叉树,判断它是否是高度平衡的二叉树。本题中,一棵高度平衡二叉树定义为:一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过1。示例 1:递归计算高度差class Solution { int count = 0; public boolean isBalanced(TreeNode root) { int istrue = deepth...原创 2019-10-25 21:28:38 · 101 阅读 · 0 评论 -
存在重复元素 III --java记录
给定一个整数数组,判断数组中是否有两个不同的索引 i 和 j,使得 nums [i] 和 nums [j] 的差的绝对值最大为 t,并且 i 和 j 之间的差的绝对值最大为 ķ思路:滑动窗口解决。始终维护一个大小为k的set。(维护为k的set,索引差始终<=k,)1、当t = 0 时,只有出现相同元素才会返回true,每次判断set是否包含,包含则返回true2、其他情况,对每次...原创 2019-10-25 17:31:05 · 393 阅读 · 1 评论 -
二叉搜索树的最近公共祖先 --java记录
递归搜索,当 root的值在 q p 之间时则为它们的公共祖先,否则分别向左子树和右子树寻找。class Solution { public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) { if(root.val >= p.val && root.val...原创 2019-10-25 16:05:54 · 101 阅读 · 0 评论 -
Kth Largest Element in a Stream --java 记录
设计一个找到数据流中第K大元素的类(class)。注意是排序后的第K大元素,不是第K个不同的元素。你的 KthLargest 类需要一个同时接收整数 k 和整数数组nums 的构造器,它包含数据流中的初始元素。每次调用 KthLargest.add,返回当前数据流中第K大的元素。示例:利用构建二叉搜索树来查找。思路:判断根节点是第几大值,因为右子树都比root都大,右子树节点个数加1,...原创 2019-10-24 20:49:33 · 135 阅读 · 0 评论 -
Delete Node in a BST --java记录
给定一个二叉搜索树的根节点 root 和一个值 key,删除二叉搜索树中的 key 对应的节点,并保证二叉搜索树的性质不变。返回二叉搜索树(有可能被更新)的根节点的引用。一般来说,删除节点可分为两个步骤:首先找到需要删除的节点;如果找到了,删除它。说明: 要求算法时间复杂度为 O(h),h 为树的高度。示例:递归查找节点删除找到节点后有4种情况1、节点左孩子为空,则让节点等于右孩...原创 2019-10-23 19:52:50 · 143 阅读 · 0 评论 -
Insert into a Binary Search Tree --java记录
给定二叉搜索树(BST)的根节点和要插入树中的值,将值插入二叉搜索树。 返回插入后二叉搜索树的根节点。 保证原始二叉搜索树中不存在新值。注意,可能存在多种有效的插入方式,只要树在插入后仍保持为二叉搜索树即可。 你可以返回任意有效的结果。循环判断找到为空的节点进行插入。class Solution { public TreeNode insertIntoBST(TreeNode ro...原创 2019-10-23 18:48:38 · 224 阅读 · 0 评论 -
Search in a Binary Search Tree --java记录
给定二叉搜索树(BST)的根节点和一个值。 你需要在BST中找到节点值等于给定值的节点。 返回以该节点为根的子树。 如果节点不存在,则返回 NULL。利用二叉搜索树条件来找节点。遇到node.val > val 则往左孩子节点走遇到node.val < val 则往有孩子节点走直到找到node.val = val 返回true。 或者走到叶子节点还没找到,在走即为null ...原创 2019-10-23 17:00:05 · 93 阅读 · 0 评论 -
验证二叉搜索树 --java记录
给定一个二叉树,判断其是否是一个有效的二叉搜索树。假设一个二叉搜索树具有如下特征:节点的左子树只包含小于当前节点的数。节点的右子树只包含大于当前节点的数。所有左子树和右子树自身必须也是二叉搜索树。思路:中序遍历的结果是从小到大排列,故采用中序遍历,对节点值进行比较,如果出现当前节点值小于前一个节点值则不是二叉搜索树。class Solution { boolean temp...原创 2019-10-22 20:03:45 · 293 阅读 · 0 评论 -
二叉树的序列化与反序列化 --java记录
序列化是将一个数据结构或者对象转换为连续的比特位的操作,进而可以将转换后的数据存储在一个文件或者内存中,同时也可以通过网络传输到另一个计算机环境,采取相反方式重构得到原数据。请设计一个算法来实现二叉树的序列化与反序列化。这里不限定你的序列 / 反序列化算法执行逻辑,你只需要保证一个二叉树可以被序列化为一个字符串并且将这个字符串反序列化为原始的树结构。看题目序列化后的字符串为层次遍历输出样式,...原创 2019-10-21 17:37:47 · 257 阅读 · 0 评论 -
二叉树的最近公共祖先 -- java记录
给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。百度百科中最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。”例如,给定如下二叉树: root = [3,5,1,6,2,0,8,null,null,7,4]说明:所有节点的值都是唯一的。p、q 为不同节...原创 2019-10-18 21:03:33 · 249 阅读 · 0 评论 -
填充每个节点的下一个右侧节点指针 II --java记录
填充每个节点的下一个右侧节点指针 II使用递归这套题和填充每个节点的下一个右侧节点指针1递归写法有一点点区别。递归时需要先构建右子树。与1不同时因为在构建按root的孩子节点next指向时,可能会需要指向root.next.next 以后的孩子,而若先递归左子树则只能找到root.next的孩子,后面就无法找到导致构建next失败。class Solution { publi...原创 2019-10-18 19:23:42 · 179 阅读 · 0 评论 -
填充每个节点的下一个右侧节点指针 --java记录
给定一个完美二叉树,其所有叶子节点都在同一层,每个父节点都有两个子节点。二叉树定义如下:提示:你只能使用常量级额外空间。使用递归解题也符合要求,本题中递归程序占用的栈空间不算做额外的空间复杂度。思路:使用递归,因为为满二叉树每次将节点左孩子next指向右孩子节点,在处理右孩子节点时候next可能指向null可能指向兄弟节点的左孩子节点,这里需要判断一下节点的兄弟节点是否存在(即nod...原创 2019-10-17 20:48:46 · 121 阅读 · 0 评论 -
从前序与中序遍历序列构造二叉树 -- java记录
根据一棵树的前序遍历与中序遍历构造二叉树。注意:你可以假设树中没有重复的元素。例如,给出这道题和中序遍历与后续遍历构造树差不多,只是改一下子数组区间。这次用了hashmap保存索引,比之前中序遍历与后续遍历构造树用的循环查询效率高了。思路:从前序数组可以知道,第一个节点为树的根节点。如果找到节点后,能将前序数组分为两个左右子数组[9]、[20,15,7] 那么左右子树的根节点分别为...原创 2019-10-17 19:40:09 · 292 阅读 · 0 评论 -
从中序与后序遍历序列构造二叉树 --java记录
根据一棵树的中序遍历与后序遍历构造二叉树。注意:你可以假设树中没有重复的元素。例如,给出思路:1、通过中序遍历和后续遍历可以看出,后续遍历中最后一个节点3为跟节点。2、根据这个节点可以将中序遍历数组分为两个左右子树数组 [9] [15,20,7]3、通过对中序遍历数组划分,可以直到左子树节点个数,然后对后续遍历数组进行划分[9] [15,7,20]4、后序遍历数组划分完成后,可...原创 2019-10-17 17:39:22 · 592 阅读 · 1 评论 -
路径总和 --java记录
给定一个二叉树和一个目标和,判断该树中是否存在根节点到叶子节点的路径,这条路径上所有节点值相加等于目标和。说明: 叶子节点是指没有子节点的节点。示例:给定如下二叉树,以及目标和 sum = 22,递归 - 做减法。每次传入的的参数为sum - 节点value直到递归到叶子节点,且 最后计算为0则返回ture。左右子树进行递归 ,如果出现一次true则得到目标值 返回true。/...原创 2019-10-14 22:10:03 · 123 阅读 · 0 评论 -
对称二叉树 --java 递归与迭代记录
给定一个二叉树,检查它是否是镜像对称的。例如,二叉树 [1,2,2,3,4,4,3] 是对称的。使用递归。这颗树的做组左子树与右子树相同,左子树的左子树和右子树的右子树相同,同时左子树的右子树和右子树的左子树相同。1、先将根的左子树与右子树传入,先比较根节点是否相同。2、再依次递归分别对左子树的左子树和右子树的右子树 的根节点判断。左子树的右子树和右子树的左子树 的根节点进行判断。3...原创 2019-10-14 20:00:26 · 120 阅读 · 0 评论 -
二叉树的层次遍历 --java记录
给定一个二叉树,返回其按层次遍历的节点值。 (即逐层地,从左到右访问所有节点)。例如:给定二叉树: [3,9,20,null,null,15,7],利用队列1、queue存储一次层节点2、读取一层节点的值,与存储孩子节点。利用循环条件为queue大小length(代表上一层节点数,则需要存储多少次左右孩子节点),每次先出队列取上一层节点,然后分别将左右孩子节点入队,节点值添加到lis...原创 2019-10-11 20:29:25 · 292 阅读 · 0 评论 -
寻找旋转排序数组中的最小值 II --java记录
假设按照升序排序的数组在预先未知的某个点上进行了旋转。( 例如,数组 [0,1,2,4,5,6,7] 可能变为 [4,5,6,7,0,1,2] )。请找出其中最小的元素。注意数组中可能存在重复的元素。采用二分查找方法。1、当mid值大于right值时,最小值在右半区域。2、当mid值小于right值时,最小值在左半区域。3、当mid值等于right值时候,无法判断最小值在右边还是左...原创 2019-10-06 20:00:47 · 109 阅读 · 0 评论 -
寻找比目标字母大的最小字母 -- java记录
给定一个只包含小写字母的有序数组letters 和一个目标字母 target,寻找有序数组里面比目标字母大的最小字母。数组里字母的顺序是循环的。举个例子,如果目标字母target = ‘z’ 并且有序数组为 letters = [‘a’, ‘b’],则答案返回 ‘a’。注:letters长度范围在[2, 10000]区间内。letters 仅由小写字母组成,最少包含两个不同的字母。目标...原创 2019-09-30 22:03:28 · 125 阅读 · 0 评论 -
二叉树的最大深度 --java记录
给定一个二叉树,找出其最大深度。二叉树的深度为根节点到最远叶子节点的最长路径上的节点数。说明: 叶子节点是指没有子节点的节点。递归找出左右子树中高度最大的树class Solution { public int maxDepth(TreeNode root) { if(root == null) { return 0; } return 1+Math.max(m...原创 2019-09-19 17:34:28 · 663 阅读 · 0 评论 -
寻找重复数 --java 记录
给定一个包含 n + 1 个整数的数组 nums,其数字都在 1 到 n 之间(包括 1 和 n),可知至少存在一个重复的整数。假设只有一个重复的整数,找出这个重复的数。说明:不能更改原数组(假设数组是只读的)。只能使用额外的 O(1) 的空间。时间复杂度小于 O(n2) 。数组中只有一个重复的数字,但它可能不止重复出现一次思路:数组大小为n+1,其数字都在 1 到 n 之间,并且只...原创 2019-10-07 21:13:41 · 436 阅读 · 0 评论 -
二叉树的前序遍历 --java
给定一个二叉树,返回它的 前序 遍历。利用栈保存节点。class Solution { public List<Integer> preorderTraversal(TreeNode root) { LinkedList<Integer> list = new LinkedList<Integer>(); if(ro...原创 2019-10-11 16:05:08 · 140 阅读 · 0 评论 -
二叉树的中序遍历 --java 记录
给定一个二叉树,返回它的中序 遍历。首先用递归 /** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode(int...原创 2019-09-03 20:25:46 · 107 阅读 · 0 评论 -
二叉树的后序遍历 --java
给定一个二叉树,返回它的 后序 遍历。利用递归,先递归左节点然后递归右节点,最后访问节点值。class Solution { public List<Integer> postorderTraversal(TreeNode root) { LinkedList<Integer> list = new LinkedList<Integer&g...原创 2019-10-11 18:26:55 · 221 阅读 · 0 评论 -
找到 K 个最接近的元素 --java记录
给定一个排序好的数组,两个整数 k 和 x,从数组中找到最靠近 x(两数之差最小)的 k 个数。返回的结果必须要是按升序排好的。如果有两个数与 x 的差值一样,优先选择数值较小的那个数。思路:二分法查找1、利用二分法先找到中间值,left 或 right 值是 等于x,如果数组不存在x则 两个值最接近x。2、将left 与right 值 与x 做差进行比较,小则left – ,大则rig...原创 2019-09-30 20:31:32 · 708 阅读 · 0 评论 -
在排序数组中查找元素的第一个和最后一个位置 --java记录
给定一个按照升序排列的整数数组 nums,和一个目标值 target。找出给定目标值在数组中的开始位置和结束位置。你的算法时间复杂度必须是 O(log n) 级别。如果数组中不存在目标值,返回 [-1, -1]。采用两次二分查找法,第一次找出最target最左边的位子,第二次找出target最右边的位子。class Solution { public int[] searchR...原创 2019-09-29 21:12:33 · 159 阅读 · 0 评论 -
相交链表 --java记录
编写一个程序,找到两个单链表相交的起始节点。如下面的两个链表:输入:intersectVal = 8, listA = [4,1,8,4,5], listB = [5,0,1,8,4,5], skipA = 2, skipB = 3输出:Reference of the node with value = 8输入解释:相交节点的值为 8 (注意,如果两个列表相交则不能为 0)。从各自的表...原创 2019-09-23 21:02:17 · 319 阅读 · 0 评论 -
环形链表 II --java记录
给定一个链表,返回链表开始入环的第一个节点。 如果链表无环,则返回 null。为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。 如果 pos 是 -1,则在该链表中没有环。说明:不允许修改给定的链表。利用快慢指针,快指针从初始节点每次移动两次,慢移动一次。循环到相遇位子则先判断出有环形。出现环形之后,head到第一个入口节点的路程 与...原创 2019-09-23 18:09:35 · 109 阅读 · 0 评论 -
环形链表 --java 记录
给定一个链表,判断链表中是否有环。为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。 如果 pos 是 -1,则在该链表中没有环。使用快慢指针,如果相遇,则存在环/** * Definition for singly-linked list. * class ListNode { * int val; * ListN...原创 2019-09-23 17:01:27 · 77 阅读 · 0 评论 -
设计链表 --java记录
class ListNode { int val; ListNode next; ListNode (int val) {this.val = val;}}class MyLinkedList { /** Initialize your data structure here. */ ListNode head = null; public M...原创 2019-09-23 16:43:59 · 110 阅读 · 0 评论 -
第K个语法符号 -- java记录
在第一行我们写上一个 0。接下来的每一行,将前一行中的0替换为01,1替换为10。给定行数 N 和序数 K,返回第 N 行中第 K个字符。(K从1开始)直接用动态数组记录,提示超出内存限制。第一行: 0第二行: 01第三行: 0110第四行: 01101001可以看出规律,每一行都保存了上一行内容,需要新添加的为 上一行一半内容。class Solution { publi...原创 2019-09-20 18:53:36 · 822 阅读 · 0 评论 -
Pow(x, n)--递归 JAVA记录 -- leecode
现 pow(x, n) ,即计算 x 的 n 次幂函数leecode 讲解记录方法一:暴力法思路只需模拟将 x 相乘 n 次的过程。class Solution { public double myPow(double x, int n) { long N = n; if (N < 0) { x = 1 / x; ...转载 2019-09-19 19:57:00 · 166 阅读 · 0 评论 -
递归 —— 时间复杂度 --lecoode记录
给出一个递归算法,其时间复杂度 O(T) 通常是递归调用的数量(记作 R) 和计算的时间复杂度的乘积(表示为 O(s))的乘积:O(T)=R∗O(s)示例也许你还记得,在反转字符串问题中,我们需要以相反的顺序打印字符串,解决问题的递归关系可以表示如下:printReverse(str) = printReverse(str[1…n]) + print(str[0])其中 str[1…n]...转载 2019-09-18 19:53:49 · 419 阅读 · 0 评论 -
爬楼梯 --java记录
假设你正在爬楼梯。需要 n 阶你才能到达楼顶。每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?注意:给定 n 是一个正整数。示例 1:示例 2:解释方法摘自leecode方法一:暴力法算法在暴力法中,我们将会把所有可能爬的阶数进行组合,也就是 1 和 2 。而在每一步中我们都会继续调用 climbStairsclimbStairs 这个函数模拟爬 1 阶和 2 ...原创 2019-09-18 19:41:46 · 271 阅读 · 0 评论 -
反转链表 -- java记录
反转一个单链表。示例:输入: 1->2->3->4->5->NULL输出: 5->4->3->2->1->NULL进阶:你可以迭代或递归地反转链表。你能否用两种方法解决这道题?解答:方法一迭代将当前节点指向前一个节点,直至当前节点为空class Solution { public ListNode reverseL...原创 2019-09-17 20:30:04 · 83 阅读 · 0 评论 -
两两交换链表中的节点 --java记录
给定一个链表,两两交换其中相邻的节点,并返回交换后的链表。你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。利用递归解决。 每次交换head 与head.next节点。交换后head.next.next 指向下次交换后的头节点class Solution { public ListNode swapPairs(ListNode head) { if(head...原创 2019-09-17 19:20:03 · 95 阅读 · 0 评论 -
前 K 个高频元素 --java记录
利用map ,key为数值,value为数值出现的次数。根据value值进行逆序排序然后输出前k public List<Integer> topKFrequent(int[] nums, int k) { HashMap<Integer,Integer> map = new HashMap<Integer,Integer>(); ...原创 2019-09-16 19:22:51 · 156 阅读 · 1 评论 -
删除链表的倒数第N个节点 -- java记录
定义两个节点,b指向第n个节点的位子,a为第一个。然后,一起走,当b走到最后一个节点位子的时候,a节点即为要删除的节点。class Solution { public ListNode removeNthFromEnd(ListNode head, int n) { ListNode a = head; ListNode b = head; ...原创 2019-09-23 21:31:30 · 75 阅读 · 0 评论