算法
xing_ran_ran
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
LeetCode 热题 HOT 100 - 617. 合并二叉树
思路1:深度优先搜索可以使用深度优先搜索合并两个二叉树。从根节点开始同时遍历两个二叉树,并将对应的节点进行合并。两个二叉树的对应节点可能存在以下三种情况,对于每种情况使用不同的合并方式。 如果两个二叉树的对应节点都为空,则合并后的二叉树的对应节点也为空; 如果两个二叉树的对应节点只有一个为空,则合并后的二叉树的对应节点为其中的非空节点; 如果两个二叉树的对应节点都不为空,则合并后的二叉树的对应节点的值为两个二叉树的对应节点的值之和,此时需要显性合并...原创 2021-03-08 15:52:08 · 199 阅读 · 0 评论 -
LeetCode 热题 HOT 100 - 543. 二叉树的直径
思路:注意题目要求不能使用额外空间,这就是题目的难点所在。这道题的描述部分包含了非常重要的信息,1 ≤ a[i] ≤ n,即每个数字本身都对应一个 i-1 的数组下标。我们可以利用数组内容本身跟数字下标的关联找出缺失的数字。...原创 2021-03-08 10:58:02 · 203 阅读 · 0 评论 -
LeetCode 热题 HOT 100 - 283. 移动零
思路:双指针(快慢指针)初始状态:i (fast)指向当前遍历的元素 ; j (slow)表示下一个非0元素存放的位置 时间复杂度:O(n),其中n为序列长度。每个位置至多被遍历两次。 空间复杂度:O(1)。只需要常数的空间存放若干变量。 public void moveZeroes(int[] nums) { if (nums == null || nums.length == 0) { return; } int slow...原创 2021-03-07 16:57:34 · 164 阅读 · 0 评论 -
LeetCode 热题 HOT 100 - 234. 回文链表
思路:快慢指针避免使用 O(n) 额外空间的方法就是改变输入。我们可以将链表的后半部分反转(修改链表结构),然后将前半部分和后半部分进行比较。比较完成后我们应该将链表恢复原样。虽然不需要恢复也能通过测试用例,但是使用该函数的人通常不希望链表结构被更改。该方法虽然可以将空间复杂度降到 O(1),但是在并发环境下,该方法也有缺点。在并发环境下,函数运行时需要锁定其他线程或进程对链表的访问,因为在函数执行过程中链表会被修改。整个流程可以分为以下五个步骤:过滤掉空链表或者单节点链表的情况,这..原创 2021-03-06 21:54:29 · 257 阅读 · 0 评论 -
LeetCode 热题 HOT 100 - 226. 翻转二叉树
思路:递归从根节点开始,递归地对树进行遍历,并从叶子结点先开始翻转。如果当前遍历到的节点 \textit{root}root 的左右两棵子树都已经翻转,那么我们只需要交换两棵子树的位置,即可完成以 \textit{root}root 为根节点的整棵子树的翻转。——时间复杂度:O(N),其中 N 为二叉树节点的数目。我们会遍历二叉树中的每一个节点,对每个节点而言,我们在常数时间内交换其两棵子树。——空间复杂度:O(N)。使用的空间由递归栈的深度决定,它等于当前节点在二叉树中的高度。在平均情况下..原创 2021-03-06 20:51:38 · 250 阅读 · 0 评论 -
LeetCode 热题 HOT 100 - 206. 反转链表
思路1:迭代初始:——时间复杂度:O(n),其中n是链表的长度。需要遍历链表一次。——空间复杂度:O(1)。/** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode() {} * ListNode(int val) { this.val = val; } * ListN...原创 2021-03-06 20:32:48 · 290 阅读 · 0 评论 -
LeetCode 热题 HOT 100 - 169. 多数元素
思路:原创 2021-03-06 19:37:37 · 188 阅读 · 0 评论 -
LeetCode 热题 HOT 100 - 160. 相交链表
思路:双指针法——时间复杂度 :O(m+n)——空间复杂度 :O(1)/** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode(int x) { * val = x; * next = null; * } * } */public ListNod...原创 2021-03-06 17:08:30 · 205 阅读 · 0 评论 -
LeetCode 热题 HOT 100 - 155. 最小栈
思路:辅助栈1)初始化数据栈和辅助栈 2)push操作时,首先将元素压入数据栈,需要保持辅助栈的栈顶为最小值,如果当前元素是当前最小值需要压入辅助栈 3)pop操作时,首先删除数据栈的栈顶元素,若该元素是当前的最小值,也需要删除辅助栈的栈顶元素 4)top操作时,返回数据栈的栈顶元素 5)getMin操作时,返回辅助栈的栈顶元素——时间复杂度:对于题目中的所有操作,时间复杂度均为 O(1)。因为栈的插入、删除与读取操作都是 O(1),我们定义的每个操作最多调用栈操作两次。——空间复杂度:O(..原创 2021-03-06 16:41:45 · 238 阅读 · 0 评论 -
LeetCode 热题 HOT 100 - 141. 环形链表
思路1:哈希表使用哈希表来存储所有已经访问过的节点。每次我们到达一个节点,如果该节点已经存在于哈希表中,则说明该链表是环形链表,否则就将该节点加入哈希表中。重复这一过程,直到我们遍历完整个链表即可——时间复杂度:O(N),其中 N 是链表中的节点数。最坏情况下我们需要遍历每个节点一次。——空间复杂度:O(N),其中 N 是链表中的节点数。主要为哈希表的开销,最坏情况下我们需要将每个节点插入到哈希表中一次。/** * Definition for singly-linked list...原创 2021-03-06 15:42:15 · 261 阅读 · 0 评论 -
LeetCode 热题 HOT 100 - 136. 只出现一次的数字
思路:如果不考虑时间复杂度和空间复杂度的限制,这道题有很多种解法,可能的解法有如下几种。1) 使用集合存储数字。遍历数组中的每个数字,如果集合中没有该数字,则将该数字加入集合,如果集合中已经有该数字,则将该数字从集合中删除,最后剩下的数字就是只出现一次的数字。2) 使用哈希表存储每个数字和该数字出现的次数。遍历数组即可得到每个数字出现的次数,并更新哈希表,最后遍历哈希表,得到只出现一次的数字。3) 使用集合存储数组中出现的所有数字,并计算数组中的元素之和。由于集合保证元素无重复,因此计..原创 2021-03-06 11:38:54 · 277 阅读 · 0 评论 -
LeetCode 热题 HOT 100 - 121. 买卖股票的最佳时机
思路:假设给定的数组为:[7, 1, 5, 3, 6, 4]如果我们在图表上绘制给定数组中的数字,我们将会得到:我们来假设自己来购买股票。随着时间的推移,每天我们都可以选择出售股票与否。那么,假设在第 i 天,如果我们要在今天卖股票,那么我们能赚多少钱呢?显然,如果我们真的在买卖股票,我们肯定会想:如果我是在历史最低点买的股票就好了!太好了,在题目中,我们只要用一个变量记录一个历史最低价格 minprice,我们就可以假设自己的股票是在那天买的。那么我们在第 i 天卖出股票能得到的利..原创 2021-03-06 10:58:42 · 141 阅读 · 0 评论 -
LeetCode 热题 HOT 100 - 94. 二叉树的中序遍历
思路1:递归定义 inorder(root) 表示当前遍历到 root 节点的答案,那么按照定义,我们只要递归调用 inorder(root.left) 来遍历 root 节点的左子树,然后将 root 节点的值加入答案,再递归调用inorder(root.right) 来遍历 root 节点的右子树即可,递归终止的条件为碰到空节点。——时间复杂度:O(N)——空间复杂度:O(N)/** * Definition for a binary tree node. * public c..原创 2021-03-03 22:23:13 · 259 阅读 · 1 评论 -
LeetCode 热题 HOT 100 - 111. 二叉树的最小深度
思路1:深度优先搜索首先可以想到使用深度优先搜索的方法,遍历整棵树,记录最小深度。对于每一个非叶子节点,我们只需要分别计算其左右子树的最小叶子节点深度。这样就将一个大问题转化为了小问题,可以递归地解决该问题。——时间复杂度:O(N)其中N是树的节点数。对每个节点访问一次。——空间复杂度:O(H)其中 H 是树的高度。空间复杂度主要取决于递归时栈空间的开销,最坏情况下,树呈现链状,空间复杂度为 O(N)。平均情况下树的高度与节点数的对数正相关,空间复杂度为 O(logN)/*...原创 2021-03-02 21:43:48 · 269 阅读 · 0 评论 -
LeetCode 热题 HOT 100 - 110. 平衡二叉树
根据定义,一棵二叉树是平衡二叉树,当且仅当其所有子树也都是平衡二叉树,因此可以使用递归的方式判断二叉树是不是平衡二叉树,递归的顺序可以是自顶向下或者自底向上。思路1:自顶向下递归定义函数height,用于计算二叉树中的任意一个节点 p 的高度:有了计算节点高度的函数,即可判断二叉树是否平衡。具体做法类似于二叉树的前序遍历,即对于当前遍历到的节点,首先计算左右子树的高度,如果左右子树的高度差是否不超过 11,再分别递归地遍历左右子节点,并判断左子树和右子树是否平衡。这是一个自顶向下的递归的..原创 2021-03-02 20:28:06 · 167 阅读 · 0 评论 -
LeetCode 热题 HOT 100 - 108. 将有序数组转换为二叉搜索树
思路:递归二叉搜索树(BST) : 根节点左子树的值都小于根节点的值,根节点右子树的值都大于根节点的值。这和题中的排序数组有什么关联呢?如果选定一个值作为根节点,那么数组中,左侧的元素即左子树,右侧的元素即右子树,而左侧的树也是排序的,所以构造左子树的过程和原问题一致,根据对称性,右子树同理。这样就构造出一个子问题:假设选取数组中的一个元素作为根节点,那么对于该元素左侧的元素递归构成左子树,对于该元素右侧的元素递归构成右子树,现在如何选取根节点成了唯一的问题!排序数组到BST的映射不..原创 2021-03-02 17:03:47 · 127 阅读 · 0 评论 -
LeetCode 热题 HOT 100 - 104. 二叉树的最大深度
思路1:深度优先搜索如果我们知道了左子树和右子树的最大深度l 和r,那么该二叉树的最大深度即为max(l,r)+1——时间复杂度:O(N) 因为需要遍历每一个节点——空间复杂度:O(height) 因为用到递归,递归所用的空间等于递归的深度,即树的深度/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * Tre...原创 2021-03-02 11:34:43 · 188 阅读 · 0 评论 -
LeetCode 热题 HOT 100 - 101. 对称二叉树
思路1:递归如果一个树的左子树与右子树镜像对称,那么这个树是对称的。因此,该问题可以转化为:两个树在什么情况下互为镜像?1.两棵树本身根节点相同 2.子树互为镜像/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode() {} * TreeNode..原创 2021-03-02 10:38:31 · 200 阅读 · 0 评论 -
LeetCode 热题 HOT 100 - 70. 爬楼梯
思路:动态规划爬到每一级台阶的方法看作一个状态,用dp数组记录n个状态,从1到n依次更新每个状态。class Solution { public int climbStairs(int n) { if(n==1){ return 1; } int[] dp = new int[n+1]; dp[1]=1; dp[2]=2; for(int i=3;i<=n;..原创 2021-02-28 22:18:03 · 162 阅读 · 0 评论 -
LeetCode 热题 HOT 100 - 53. 最大子序和
思路:动态规划若前一个元素大于0,则将其加到当前元素上。当i指到-2时是初始值,当i指向1时,因为前一个元素是-2<0,所以保持当前元素不变,当i指向-3时,因为前一个元素是1>0,因此将前一个元素加到当前元素上,-3变为-2,依此类推,最后通过取列表中最大元素得到想要的答案。代码实现:遍历数组元素,若前一个元素大于0,则将其加到当前元素上,最后返回修改过的数组中的最大值。——时间复杂度:O(N),只遍历一次数组——空间复杂度:O(1),动态规划算法没..原创 2021-02-28 21:43:31 · 159 阅读 · 0 评论 -
LeetCode 热题 HOT 100 - 21. 合并两个有序链表
思路:链表问题考虑哑节点!引入哑节点,值设为-1,作为合并链表的头节点之前prehead;l1,l2分别指向传入链表的头节点。比较l1,l2,把prev.next指向较小的那个,prev和较小的指针分别向前移动,这里由于l1和l2的值相同,不妨先移动l2,依此类推。重复该过程,直至遍历完整个链表。 /** * Definition for singly-linked list. * public class ListN...原创 2021-02-28 18:27:06 · 202 阅读 · 0 评论 -
LeetCode 热题 HOT 100 - 20.有效的括号
思路:判断括号的有效性可以使用「栈」这一数据结构来解决。先出现的左括号后匹配——先进后出用栈!此题,把左括号加入栈,匹配的过程就是出栈的过程。代码实现:1定义辅助函数判断一对符号是否匹配 2核心函数:字符串空返回真;遍历字符串,如果是右括号的情况,判断栈顶是否是匹配的左括号,匹配成功则出栈;如果是左括号,入栈等待匹配;最后,完全匹配的要求是栈为空。class Solution { public boolean isValid(Stri...原创 2021-02-28 17:41:39 · 213 阅读 · 0 评论 -
LeetCode 热题 HOT 100 -1.两数之和
class Solution { public int[] twoSum(int[] nums, int target) { Map<Integer,Integer> hashmap = new HashMap<Integer,Integer>(); for(int i=0;i<nums.length;i++){ if(hashmap.containsKey(target-nums[i])){ ...原创 2021-02-28 17:07:07 · 177 阅读 · 0 评论
分享