熠熠晨曦_
在读研究生|不断学习中……
展开
-
动态规划
动态规划,英文:Dynamic Programming,简称DP,如果某一问题有很多重叠子问题,使用动态规划是最有效的动态规划中每一个状态一定是由上一个状态推导出来的,**这一点就区分于贪心**,贪心没有状态推导,而是从局部直接选最优的**对于动态规划问题,拆解为如下五步曲,这五步都搞清楚了,才能说把动态规划真的掌握了**1. dp数组以及下标的含义2. 递推公式3. dp数组如何初始化4. 遍历顺序5. 举例推导(打印)dp数组原创 2024-06-14 11:41:58 · 597 阅读 · 1 评论 -
贪心算法
贪心的本质是选择每一阶段的局部最优,从而达到全局最优例如,有一堆钞票可以拿走十张,如何拿走最多的钱每次拿最大的面额,最终就会拿走最多的钱,每次拿最大面额就是局部最优,最后拿走最多的钱就是全局最优贪心算法并没有固定的套路靠自己手动模拟,如果模拟可行,就可以试一试贪心策略,如果不可行,可能就需要动态规划手动模拟一下,感觉可以局部最优推出整体最优,而且想不到反例,那么就试一试贪心贪心有时候就是常识性的推导,本应该就这么做贪心 = 常识性推导 + 举反例455. 分发饼干 - 力扣(LeetCode)给定两个数组,原创 2024-06-14 11:27:40 · 310 阅读 · 0 评论 -
回溯算法
回溯法也可以叫做回溯搜索法,它是一种搜索的方式。回溯是递归的副产品,只要有递归就会有回溯。回溯函数也就是递归函数回溯和递归是相辅相成的回溯法是暴力查找并不高效回溯法解决的每一类问题都不简单回溯法解决的问题都可以抽象为树形结构(N叉树)回溯算法是指数级别的时间复杂度。原创 2024-06-13 14:52:52 · 786 阅读 · 0 评论 -
LeetCode 0538.把二叉搜索树转换为累加树
LeetCode 0538.把二叉搜索树转换为累加树原创 2023-01-08 16:48:27 · 174 阅读 · 0 评论 -
LeetCode 0108.将有序数组转换为二叉搜索树
LeetCode 0108.将有序数组转换为二叉搜索树原创 2023-01-08 16:48:41 · 184 阅读 · 0 评论 -
LeetCode 0669.修剪二叉搜索树【Go】
LeetCode 0669.修剪二叉搜索树原创 2023-01-08 16:47:23 · 140 阅读 · 0 评论 -
LeetCode 0450.删除二叉搜索树中的节点【Go】
LeetCode 0450.删除二叉搜索树中的节点原创 2023-01-04 12:38:42 · 178 阅读 · 0 评论 -
LeetCode 0701.二叉搜索树中的插入操作【Go】
LeetCode 0701.二叉搜索树中的插入操作原创 2023-01-04 12:37:45 · 170 阅读 · 0 评论 -
LeetCode 0235.二叉搜索树的最近公共祖先【Go】
LeetCode 0235.二叉搜索树的最近公共祖先原创 2023-01-04 12:14:36 · 139 阅读 · 0 评论 -
LeetCode 0236.二叉树的最近公共祖先【Go】
LeetCode 0236.二叉树的最近公共祖先原创 2023-01-04 12:13:41 · 427 阅读 · 0 评论 -
LeetCode 0501.二叉搜索树中的众数【Go】
LeetCode 0501.二叉搜索树中的众数原创 2023-01-04 12:13:40 · 238 阅读 · 0 评论 -
LeetCode 0530.二叉搜索树的最小绝对差【Go】
LeetCode 0530.二叉搜索树的最小绝对差原创 2023-01-04 12:12:14 · 163 阅读 · 0 评论 -
LeetCode 0098.验证二叉搜索树【Go】
LeetCode 0098.验证二叉搜索树原创 2023-01-04 12:01:58 · 226 阅读 · 0 评论 -
LeetCode 0700.二叉搜索树中的搜索【Go】
LeetCode 0700.二叉搜索树中的搜索原创 2023-01-04 12:02:08 · 204 阅读 · 0 评论 -
LeetCode 0617.合并二叉树【Go】
LeetCode 0617.合并二叉树原创 2023-01-04 11:54:45 · 110 阅读 · 0 评论 -
LeetCode 0654.最大二叉树【Go】
LeetCode 0654.最大二叉树原创 2023-01-04 11:53:34 · 148 阅读 · 0 评论 -
LeetCode 0106.从中序和后序遍历序列构造二叉树【Go】
LeetCode 0106.从中序和后序遍历序列构造二叉树原创 2023-01-03 21:40:52 · 246 阅读 · 0 评论 -
LeetCode 0112.路径之和【Go】
LeetCode 0112.路径之和原创 2023-01-03 21:39:35 · 113 阅读 · 0 评论 -
LeetCode 0513.找树左下角的值【Go】
LeetCode 0513.找树左下角的值原创 2023-01-03 21:39:03 · 134 阅读 · 0 评论 -
LeetCode 0404.左叶子之和【Go】
LeetCode 0404.左叶子之和原创 2023-01-03 21:39:08 · 194 阅读 · 0 评论 -
LeetCode 0257.二叉树的所有路径【Go】
LeetCode 0257.二叉树的所有路径原创 2023-01-03 21:38:21 · 170 阅读 · 0 评论 -
LeetCode 0110.平衡二叉树【Go】
LeetCode 0110.平衡二叉树原创 2023-01-03 21:37:26 · 145 阅读 · 0 评论 -
LeetCode 0111.二叉树的最小深度【Go】
二叉树的最小深度LeetCode111. 二叉树的最小深度题目描述给定一个二叉树,找出其最小深度。最小深度是从根节点到最近叶子节点的最短路径上的节点数量。说明:叶子节点是指没有子节点的节点。思路本题使用层序遍历的方式来解决,只有当左右孩子都为空的时候,才说明找到了最小深度。如果其中一个孩子为空则不是最小深度。代码Gotype TreeNode struct { Val int Left *TreeNode Right *TreeNode}func minDepth(r原创 2022-03-30 15:31:46 · 850 阅读 · 0 评论 -
LeetCode 0104.二叉树的最大深度【Go】
二叉树的最大深度LeetCode104. 二叉树的最大深度题目描述给定一个二叉树,找出其最大深度。二叉树的深度为根节点到最远叶子节点的最长路径上的节点数。说明: 叶子节点是指没有子节点的节点。示例:给定二叉树 [3,9,20,null,null,15,7], 3 / \ 9 20 / \ 15 7返回它的最大深度 3 。思路使用迭代法的话,使用层序遍历是最为合适的,因为最大的深度就是二叉树的层数,和层序遍历的方式极其吻合。所以这道题的迭代法就是一原创 2022-03-28 23:13:05 · 146 阅读 · 0 评论 -
LeetCode 0101.对称二叉树【Go】
对称二叉树LeetCode101. 对称二叉树题目描述给你一个二叉树的根节点 root , 检查它是否轴对称。思路使用队列来比较两个树(根节点的左右子树)是否相互翻转,注意这不是层序遍历。代码Gofunc isSymmetric(root *TreeNode) bool { queue := make([]*TreeNode, 0) if root != nil { // 根节点非空,左右孩子节点入队 queue = append(queu原创 2022-03-27 23:36:52 · 725 阅读 · 0 评论 -
LeetCode 0226.翻转二叉树【Go】
翻转二叉树LeetCode226. 翻转二叉树题目描述给你一棵二叉树的根节点 root ,翻转这棵二叉树,并返回其根节点。思路遍历的过程中去翻转每一个节点的左右孩子就可以达到整体翻转的效果。使用前序遍历和后序遍历都可以,唯独中序遍历不方便,因为中序遍历会把某些节点的左右孩子翻转两次。层序遍历依然可以。这里我使用前序遍历的方式翻转二叉树。代码Gotype TreeNode struct { Val int Left *TreeNode Right *TreeNode}f原创 2022-03-26 23:47:43 · 814 阅读 · 0 评论 -
LeetCode 0102.二叉树的层序遍历【Go】
二叉树的层序遍历LeetCode102. 二叉树的层序遍历题目描述给你二叉树的根节点 root,返回其节点值的层序遍历。(即逐层地,从左到右访问所有节点)思路题目要求给定一个二叉树的根节点,层次遍历该二叉树返回其节点值的层序遍历层序遍历一个二叉树。就是从左到右一层一层的去遍历二叉树。队列先进先出,符合一层一层遍历的逻辑代码Gotype TreeNode struct { Val int Left *TreeNode Right *TreeNode}func l原创 2022-03-25 19:59:51 · 885 阅读 · 0 评论 -
LeetCode 0144.二叉树的前序遍历【Go】
二叉树的前序遍历LeetCode144. 二叉树的前序遍历LeetCode094. 二叉树的中序遍历LeetCode145. 二叉树的后序遍历题目描述给你二叉树的根节点 root ,返回它节点值的 前中后序 遍历。思路二叉树主要有两种遍历方式:深度优先遍历:先往深走,遇到叶子节点再往回走前序遍历(递归法,迭代法):中左右中序遍历(递归法,迭代法):左中右后序遍历(递归法,迭代法):左右中广度优先遍历:一层一层的去遍历层次遍历(迭代法)在深度优先遍历中:有三个顺序,原创 2022-03-25 19:59:12 · 666 阅读 · 0 评论 -
LeetCode 0347.前k个高频元素【Go】
前k个高频元素题目描述给你一个整数数组nums和一个整数k,请你返回其中出现频率前k高的元素。你可以按任意顺序返回答案。示例 1:输入: nums = [1,1,1,2,2,3], k = 2输出: [1,2]示例 2:输入: nums = [1], k = 1输出: [1]思路题目要求给定一个数组和一个整数k返回数组中出现频率前k高的元素分两步统计频率对频率排序注意用map统计数字出现的频率用sort包函数对频率进行快排代码Gofunc topKF原创 2022-03-25 19:58:40 · 1250 阅读 · 0 评论 -
LeetCode 0150.逆波兰表达式求值【Go】
逆波兰表达式求值LeetCode150. 逆波兰表达式求值题目描述根据逆波兰表示法,求表达式的值。有效的算符包括 +、-、*、/ 。每个运算对象可以是整数,也可以是另一个逆波兰表达式。注意:两个整数之间的除法只保留整数部分。可以保证给定的逆波兰表达式总是有效的。换句话说,表达式总会得出有效数值且不存在除数为 0 的情况。示例 1:输入:tokens = ["2","1","+","3","*"]输出:9解释:该算式转化为常见的中缀算术表达式为:((2 + 1) * 3) = 9示例原创 2022-03-25 19:56:32 · 153 阅读 · 0 评论 -
LeetCode 1047.删除字符串中的所有相邻重复项【Go】
删除字符串中的所有相邻重复项LeetCode1047. 删除字符串中的所有相邻重复项题目描述给出由小写字母组成的字符串 S,重复项删除操作会选择两个相邻且相同的字母,并删除它们。在 S 上反复执行重复项删除操作,直到无法继续删除。在完成所有重复项删除操作后返回最终的字符串。答案保证唯一。示例:输入:"abbaca"输出:"ca"解释:例如,在 "abbaca" 中,我们可以删除 "bb" 由于两字母相邻且相同,这是此时唯一可以执行删除操作的重复项。之后我们得到字符串 "aaca",其中原创 2022-03-25 19:55:39 · 401 阅读 · 0 评论 -
LeetCode 0020.有效的括号【Go】
有效的括号LeetCode20. 有效的括号题目描述给定一个只包括 (,),{,},[,] 的字符串 s ,判断字符串是否有效。有效字符串需满足:左括号必须用相同类型的右括号闭合。左括号必须以正确的顺序闭合。示例 1:输入:s = "()"输出:true示例 2:输入:s = "()[]{}"输出:true示例 3:输入:s = "(]"输出:false示例 4:输入:s = "([)]"输出:false示例 5:输入:s = "{[]}"输出:原创 2022-03-25 19:54:27 · 498 阅读 · 0 评论 -
LeetCode 0225.用队列实现栈【Go】
用队列实现栈LeetCode225. 用队列实现栈题目描述请你仅使用两个队列实现一个后入先出(LIFO)的栈,并支持普通栈的全部四种操作(push、top、pop 和 empty)。实现 MyStack 类:void push(int x) 将元素 x 压入栈顶。int pop() 移除并返回栈顶元素。int top() 返回栈顶元素。boolean empty() 如果栈是空的,返回 true ;否则,返回 false 。注意:你只能使用队列的基本操作 —— 也就是 push原创 2022-03-25 19:53:31 · 178 阅读 · 0 评论 -
LeetCode 0232.用栈实现队列【Go】
用栈实现队列LeetCode232. 用栈实现队列题目描述请你仅使用两个栈实现先入先出队列。队列应当支持一般队列支持的所有操作(push、pop、peek、empty):实现 MyQueue 类:void push(int x) 将元素 x 推到队列的末尾int pop() 从队列的开头移除并返回元素int peek() 返回队列开头的元素boolean empty() 如果队列为空,返回 true ;否则,返回 false说明:你只能使用标准的栈操作 —— 也就是只有push t原创 2022-03-20 20:23:42 · 245 阅读 · 0 评论 -
LeetCode 0142.环形链表II【Go】
环形链表IILeetCode142. 环形链表 II题目描述给定一个链表的头节点 head ,返回链表开始入环的第一个节点。 如果链表无环,则返回 null。如果链表中有某个节点,可以通过连续跟踪next指针再次到达,则链表中存在环。 为了表示给定链表中的环,评测系统内部使用整数pos来表示链表尾连接到链表中的位置(索引从 0 开始)。如果 pos 是 -1,则在该链表中没有环。注意:pos 不作为参数进行传递,仅仅是为了标识链表的实际情况。不允许修改链表。示例1:输入:head = [3原创 2022-03-20 20:20:51 · 401 阅读 · 0 评论 -
LeetCode 面试题02.07.链表相交【Go】
链表相交LeetCode面试题 02.07. 链表相交题目描述给你两个单链表的头节点 headA 和 headB ,请你找出并返回两个单链表相交的起始节点。如果两个链表没有交点,返回 null 。图示两个链表在节点 c1 开始相交:题目数据 保证 整个链式结构中不存在环。注意,函数返回结果后,链表必须 保持其原始结构 。示例 1:输入:intersectVal = 8, listA = [4,1,8,4,5], listB = [5,0,1,8,4,5], skipA = 2, ski原创 2022-03-20 20:20:10 · 352 阅读 · 0 评论 -
LeetCode 0019.删除链表的倒数第N个节点【Go】
删除链表的倒数第N个节点LeetCode19. 删除链表的倒数第 N 个结点题目描述示例1:输入:head = [1,2,3,4,5], n = 2输出:[1,2,3,5]示例2:输入:head = [1], n = 1输出:[]示例 3:输入:head = [1,2], n = 1输出:[1]思路题目要求题目给定一个单链表,要求删除倒数第n个节点返回删除后的链表的头节点暴力解法:遍历一遍链表,获知链表的总长度L,第二遍遍历删除从开头数起第(L-n+1)个节点。时原创 2022-03-19 11:48:22 · 183 阅读 · 0 评论 -
LeetCode 0024.两两交换链表中的节点【Go】
两两交换链表中的节点LeetCode0024. 两两交换链表中的节点题目描述给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换)。示例1:输入:head = [1,2,3,4]输出:[2,1,4,3]示例 2:输入:head = []输出:[]示例3:输入:head = [1]输出:[1]思路题目要求给定一个链表,两两交换链表中的节点,不能仅交换值返回两两节点交换后的链表的头节点这道题原创 2022-03-19 11:47:39 · 220 阅读 · 0 评论 -
LeetCode 0206.反转链表【Go】
反转链表LeetCode206. 反转链表题目描述给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。示例 1:输入:head = [1,2,3,4,5]输出:[5,4,3,2,1]示例 2:输入:head = [1,2]输出:[2,1]示例 3:输入:head = []输出:[]思路题目要求给定一个链表,反转该链表返回反转后的链表因为是单链表,所以要标记当前节点的前节点可以使用双指针法,一个标记前节点,一个标记当前节点;翻转完成后两个指针都往原创 2022-03-19 11:43:35 · 462 阅读 · 0 评论 -
LeetCode 0707.设计链表【Go】
设计链表LeetCode0707. 设计链表题目描述设计链表的实现。您可以选择使用单链表或双链表。单链表中的节点应该具有两个属性:val 和 next。val 是当前节点的值,next 是指向下一个节点的指针/引用。如果要使用双向链表,则还需要一个属性 prev 以指示链表中的上一个节点。假设链表中的所有节点都是 0-index 的。在链表类中实现这些功能:get(index):获取链表中 index 号节点的值。如果索引无效,则返回-1。addAtHead(val):在链表的第一个元素之前添原创 2022-03-19 11:41:06 · 403 阅读 · 0 评论