自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 2023.1.3零钱兑换

感悟:定义、边界信息、编码、分治、贪心、动态规划、回溯、分支限界、归纳、逆向,这些思想所表现的形式千变万化,再加上思想的各种组合更是难上加难,只有不断地勤学苦练,才能触及思想的灵魂。min(1+count[i-coin[j]]),编写一个函数返回count[i]的值,在遍历每个硬币时递归调用这个函数,再编写边界信息即可利用递归和动态规划高效解决硬币的组合问题。计算并返回可以凑成总金额所需的 最少的硬币个数。给你一个整数数组 coins ,表示不同面额的硬币;你可以认为每种硬币的数量是无限的。

2023-01-03 20:09:48 90

原创 20230102最长递增子序列

凭感觉可用动态规划,而动态规划最重要的形式是状态转移方程,依据什么绝对去定义状态转移方程很重要。这一题需要定义dp[i]表示以第i个元素为结尾的最长严格递增子序列,符合最优子结构,状态转移方程为dp[i]子序列 是由数组派生而来的序列,删除(或不删除)数组中的元素而不改变其余元素的顺序。例如,[3,6,2,7] 是数组。= max(dp[j]+1) if nums[i]>nums[j],最后返回的是dp[i]中最大的值。[0,3,1,6,2,2,7] 的子序列。

2023-01-02 21:28:01 99

原创 2022.12.25完全平方数

完全平方数 是一个整数,其值等于另一个整数的平方;换句话说,其值等于一个整数自乘的积。例如,1、4、9 和 16 都是完全平方数,而 3 和。这道题可以用动态规划,因为出现了最优子结构,每个子结构都是相同性质的,状态转移方程,假设证明。dp[n] = 1+min{dp[n-i]}给你一个整数 n ,返回 和为 n 的完全平方数的最少数量。

2022-12-25 23:12:54 114

原创 20221214除自身以外数组的乘积

这一题注意定义和边界信息就行,需要将问题进行抽象化解决。result[i]为除当前元素的其他元素的乘积,而其他元素的乘积为当前元素的左右列表之积,因此可先求出左右列表的积集合,转化为左右列表对应元素的积即可。给你一个整数数组 nums,返回 数组 answer ,其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积。题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。请不要使用除法,且在 O(n) 时间复杂度内完成此题。

2022-12-14 12:38:15 72

原创 20221213二叉树的最近公共祖先

遇到树首先的第一想法就是递归,深搜思想,分支思想,假设证明思想,事实上,定义、边界信息、编码、分治、贪心、动态规划、回溯、分支限界、归纳、逆向,这些思想已经几乎囊括了编程的所有领域,吃透了这些思想,编程就没有了弱点。这一题而言,用分治,假设func返回的是当前节点的两个目标节点的最近祖先节点,而边界条件可以为root。百度百科中最近公共祖先的定义为:“对于有根树 T 的两个节点 p、q,最近公共祖先表示为一个节点 x,满足 x 是 p、q 的祖先且 x。的深度尽可能大(一个节点也可以是它自己的祖先)。

2022-12-13 23:20:54 29

原创 2022.12.11最大正方形

在这个问题中,由于是在二维数组中进行搜索,首先考虑深搜,深搜的一个经典实现是遍历数组,对每个点进行上下左右搜索,或者在其中再构建辅助数组,但是这种方式在这个场景不成立,因为若以遍历当前元素为左上角进行正方形判断,若判断出正方形辅助数组相应位置清零,此时依然有一些情况被忽略(实际深搜真实数组上,判断在辅助数组上),所以不可取。涉及到二维数组的场景也可用动态规划来解决。在一个由 ‘0’ 和 ‘1’ 组成的二维矩阵内,找到只包含 ‘1’ 的最大正方形,并返回其面积。

2022-12-11 14:49:23 72

原创 2022.12.10回文链表

遍历链表,用数组存储,转化为回文串的问题,涉及对称可利用位置规律对称解决= null) {i ++) {}

2022-12-10 22:54:26 39

原创 2022.12.7反转二叉树

反转二叉树

2022-12-07 11:17:46 86

原创 2022.12.5前缀树

前缀树

2022-12-05 16:09:42 159

原创 2022.12.3课程表

课程表,深搜,邻接表,1..1

2022-12-03 16:27:19 52

原创 2022.12.2岛屿数量

给你一个由 ‘1’(陆地)和 ‘0’(水)组成的的二维网格,请你计算网格中岛屿的数量。岛屿总是被水包围,并且每座岛屿只能由水平方向和/或竖直方向上相邻的陆地连接形成。可以看成回溯,注意设计主函数两个for循环,dps四个方向的递归。此外,你可以假设该网格的四条边均被水包围。

2022-12-02 18:44:50 79

原创 2022.11.30相交链表

相交链表若相交则相交长度一定相同,故可逆向用栈,最后一个弹出的双栈相同节点为相交起始节点。当然,也可以集合判重,或是发现规律先移动较长链表直至两个链表长度相等,依次顺序比较,直到相同节点时即为相交起始节点。给你两个单链表的头节点 headA 和 headB ,请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点,返回 null。利用一个规律,若相交则两个链表的长度+对方不相交部分总长度相等,且遍历万自身切换成对方链表刚好指向相交起始节点。

2022-11-30 11:04:22 100

原创 2022.11.29最小栈堆

以最小堆为例,插入时,将新元素放在堆尾,之后不断地与父节点值比较,若比父节点小,不断交换,直至平衡。删除时,将堆尾元素放在堆首,将堆尾元素删除,之后队首元素不断与子节点中的较小值比较,若比子节点大,不断交换,直至平衡。MinStack() 初始化堆栈对象。void push(int val) 将元素val推入堆栈。删除堆栈顶部的元素。int top() 获取堆栈顶部的元素。int getMin() 获取堆栈中的最小元素。设计一个支持 push ,pop ,top 操作,并能在常数时间内检索到最小元素的栈。

2022-11-29 15:08:20 60

原创 2022.11.28乘积最大子数组

给你一个整数数组 nums ,请你找出数组中乘积最大的非空连续子数组(该子数组中至少包含一个数字),并返回该子数组所对应的乘积。存在最优子结构,找出状态转移方程 maxF[i] = Math.max(maxF[i - 1] * nums[i],测试用例的答案是一个 32-位 整数。可以直接双重循环,但是存在很多冗余信息。子数组 是数组的连续子序列。

2022-11-28 11:58:46 56

原创 2022.11.27反转链表

给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。设两个节点,后一个节点指向前一个节点。

2022-11-27 21:44:49 71

原创 2022.11.26排序链表

可以直接用快速排序,设置两个列表,一个是数值列表,一个是节点列表,数值列表元素变化时节点列表也跟着变,在大多数情况下有效,但是注意,快速排序最坏情况下的时间复杂度为O(n2),最好还是用归并。归并排序过程为找中位点,左右递归,合并。归并排序相对于快速排序更自然,因为其过程天然符合链表的结构。找中位点用快慢指针即可。给你链表的头结点 head ,请将其按 升序 排列并返回 排序后的链表。

2022-11-26 18:57:16 126

原创 2022.11.25LRU缓存

双向链表按照被使用的顺序存储这些键值对,靠近头部的元素是最近使用的,靠近尾部的元素是最久未使用的;capacity) 以 正整数 作为容量 capacity 初始化 LRU 缓存 int get(int key) 如果关键字 key。请你设计并实现一个满足 LRU (最近最少使用) 缓存 约束的数据结构。存在于缓存中,则返回关键字的值,否则返回 -1。void put(int key, int value) 如果关键字 key。capacity ,则应该 逐出 最久未使用的关键字。

2022-11-25 18:31:12 41

原创 2022.11.24环形链表2

首先定义三段距离,头结点到环初始节点距离a,环初始节点到相遇节点距离b,相遇节点经过一圈到环初始节点距离c。之后利用快节点速度是慢节点速度的两倍可以得到一个等式,对等式进行化简可以得到a=c的等式,这个等式意味着从头结点到环初始节点与相遇节点到环初始节点距离相等,故最后只需在创造一个头结点,与相遇节点一起移动,相遇后的节点即为环初始节点。如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。给定一个链表的头节点 head ,返回链表开始入环的第一个节点。

2022-11-24 20:12:17 30

原创 2022.11.23单词拆分

先假设,可以导出最优子结构,推出状态转移方程,那么就可以用动态规划。将一个字符串切成两端,倘若左段也能由字典拼成并且右段在字典中,则该段也能拼成以此递归,最优子结构,可得答案。给你一个字符串 s 和一个字符串列表 wordDict 作为字典。请你判断是否可以利用字典中出现的单词拼接出 s。注意:不要求字典中出现的单词全部都使用,并且字典中的单词可以重复使用。

2022-11-23 17:32:42 64

原创 2022.11.22只出现一次数字环形链表

这道题可以用很多方法,比如集合重复元素移除,哈希表遍历返回次数为1的元素,集合值*2-数组值,但是时空复杂度最低的是异或运算,相同的元素恰好抵消。如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。给你一个 非空 整数数组 nums ,除了某个元素只出现一次以外,其余每个元素均出现两次。将节点存入集合,若出现节点地址重复,则为环形链表。设一个快指针,一个慢指针,若为环形链表,则快慢指针最终一定会相遇。给你一个链表的头节点 head ,判断链表中是否有环。

2022-11-22 17:33:34 77

原创 2022.11.21最长连续序列

也可以将元素存在集合里面,并利用num-1不在集合中寻找一个连续序列的最初元素,对最初元素不断+1寻找某一连续序列的长度。给定一个未排序的整数数组 nums ,找出数字连续的最长序列(不要求序列元素在原数组中连续)的长度。请你设计并实现时间复杂度为 O(n) 的算法解决此问题。可以直接排序,看相邻的元素是否连续,连续+1,不连续置0。

2022-11-21 15:33:55 35

原创 2022.11.19二叉树展开成链表

直接前序遍历,用一个列表存储遍历的节点,之后遍历链表,对列表中的每个节点进行操作。

2022-11-19 20:38:06 89

原创 2022.11.18 单词搜索

单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的字母不允许被重复使用。给定一个 m x n 二维字符网格 board 和一个字符串单词 word。如果 word 存在于网格中,返回 true;这题可以用回溯搜索剪枝来进行,对每个格子进行起点的搜索,标记每个访问的格子,并对合法的可能空间进行搜索。

2022-11-18 15:47:46 171

原创 2022.11.16 子集

这题是标准的回溯可解问题。边界判断,顺序遍历,条件判断,符合深入回溯,不符合剪枝。要注意的是这个是求子集,因此不需要顺序判断,只需要两次深入即可。在力扣上写代码不要出现static,否则输出结果会混乱,实际上也不需要出现static,因为没有主函数,都是方法。给你一个整数数组 nums ,数组中的元素 互不相同。返回该数组所有可能的子集(幂集)。解集 不能 包含重复的子集。你可以按 任意顺序 返回解集。

2022-11-16 16:00:18 29

原创 力扣题2022.11.15

具体来说,设两个指针p0和p1,以及当前位置指针i,若arr[i]为2,i前移,若arr[i]为1,交换p1与i,i前移,若arr[i]为0,交换p0与i,并且若p0小于p1,再次交换p1与i,p0、p1、i均前移。给定一个包含红色、白色和蓝色、共 n 个元素的数组 nums ,原地对它们进行排序,使得相同颜色的元素相邻,并按照红色、白色、蓝色顺序排列。可以直接使用快速排序,逆向,头一个元素作为中间值,从右向左找一遍异常值,从左向右找一遍异常值。我们使用整数 0、 1 和 2 分别表示红色、白色和蓝色。

2022-11-15 16:29:46 24

原创 力扣题2022.10.28

动态规划,逆向,数学证明,路径最优意味着路径上的子路径都最优,因此求出原点到所有点的最优路径即可,而这只需要分情况讨论,即求得状态转移方程。动态规划的核心是状态转移方程,最优子结构。给定一个包含非负整数的 m x n 网格 grid ,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小。说明:每次只能向下或者向右移动一步。

2022-10-28 15:09:17 126

原创 力扣题2022.10.27

要实现区间的合并,首先需要考虑区间的遍历问题,最佳的遍历方式无疑是根据区间的左端点进行排序。之后还需考虑区间的合并问题,由于区间是动态合并的,而利用动态数组存储合并好的区间,并之后的区间只需与动态数组中最后一个区间比较即可,当最后一个区间的右端点小于当前区间的左端点时,将此区间加入,否则将此区间合并,这种思路可巧妙地解决区间的动态合并问题。

2022-10-27 13:34:12 84

原创 力扣题2022.10.14

这一题要仔细分析思路,想一想,凡是从第一步开始可以够得着的地方都可以遍历,取最大距离,若最大距离都到不了最后一个元素,则返回不可抵达,否则可达。给定一个非负整数数组 nums ,你最初位于数组的 第一个下标。数组中的每个元素代表你在该位置可以跳跃的最大长度。判断你是否能够到达最后一个下标。

2022-10-14 23:39:23 609

原创 力扣题2022.10.8

以当前字符作为结尾,状态转移方程为dp[i]=Math.max(dp[i-1]+nums[i],nums[i])给你一个整数数组 nums ,请你找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。可寻找出一个规律,分类讨论,分left、mid和right,从mid左右扩散、左区间和右区间中找最大值即可。字母异位词 是由重新排列源单词的字母得到的一个新单词,所有源单词中的字母通常恰好只用一次。如以排序后的字符串为键,或者以各个字母出现的次数为键。子数组 是数组中的一个连续部分。

2022-10-08 12:33:36 35

原创 力扣题2022.10.7

你必须在 原地 旋转图像,这意味着你需要直接修改输入的二维矩阵。请不要 使用另一个矩阵来旋转图像。给定一个 n × n 的二维矩阵 matrix 表示一个图像。请你将图像顺时针旋转 90 度。数学规律,对于矩阵中第 i 行的第 j 个元素,在旋转后,它出现在第 j 行的第 n-i 列。注意在旋转之中,永远是四个项值在发生旋转变化,故可对这四个项值进行原地反转。水平反转后接主对角线反转即可实现90度顺时针旋转图像。

2022-10-07 22:05:56 60

原创 力扣题2022.10.6

给你一个 无重复元素 的整数数组 candidates 和一个目标整数 target ,找出 candidates 中可以使数字和为目标数。如果至少一个数字的被选数量不同,则两种组合是不同的。给定一个不含重复数字的数组 nums ,返回其 所有可能的全排列。回溯模板,临界条件,顺序遍历,条件判断,深入,回溯。注意深入有两种操作,不加当前数,加当前数。回溯模板,临界条件,顺序遍历,条件判断,深入,回溯。设定一个判断数组,用于条件判断。对于给定的输入,保证和为 target 的不同组合数少于 150 个。

2022-10-06 19:35:58 81

原创 力扣题2022.10.5

给你一个按照非递减顺序排列的整数数组 nums,和一个目标值 target。请你找出给定目标值在数组中的开始位置和结束位置。如果数组中不存在目标值 target,返回 [-1, -1]。你必须设计并实现时间复杂度为 O(log n) 的算法解决此问题。

2022-10-05 16:25:47 107

原创 力扣题2022.10.4

这道题有一个规律,下一个排列即需要找一个交换对,满足左边较小的数尽量靠右,右边较大的数尽量较小,交换完之后还需对左边较小数位置的右边部分进行升序排序。例如,arr = [1,2,3] 的下一个排列是 [1,3,2]。例如,arr = [1,2,3] ,以下这些都可以视作 arr 的排列:[1,2,3]、[1,3,2]、[3,1,2]、[2,3,1]。而 arr = [3,2,1] 的下一个排列是 [1,2,3] ,因为 [3,2,1] 不存在一个字典序更大的排列。

2022-10-04 16:35:19 53

原创 力扣题2022.10.3

给定一个只包括 ‘(’,‘)’,‘{’,‘}’,‘[’,‘]’ 的字符串 s ,判断字符串是否有效。左括号必须用相同类型的右括号闭合。左括号必须以正确的顺序闭合。每个右括号都有一个对应的相同类型的左括号。将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。按顺序比较,直到一个链表为空,之后将不为空的链表的后面节点直接接上新链表的后面,注意特殊情况。可借助栈,将(,{,[入栈,遇),},]出栈匹配,不匹配则括号无效,同时需考虑一些特殊情况。

2022-10-03 21:16:21 145

原创 力扣题2022.10.2

先设一个快指针从头结点移动n个位置,再设一个慢指针指向头结点,之后一起移动快慢指针,当快指针为null时,慢指针所指向的节点就是待删除节点。再利用哨兵,可以很容易地将慢指针指向待删除节点的前一节点。这一题可用回溯法模板,临界条件、顺序遍历、判定条件、深入、回溯,这一题没有判定条件,生成的所有情况都是正确的。利用栈后进先出的特点,出栈找到待删除节点得到前一个节点,之后执行删除操作。为便于统一逻辑,可增加一个空间作为哨兵。给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。

2022-10-02 12:26:31 252

原创 力扣题2022.10.1

今天刷了三道题,用了两个多小时,时间成本还是有点大。之后还是一天刷两道题比较合适,留下更多的时间做一些更多价值的事情。

2022-10-01 16:46:53 88

原创 力扣题2022.9.30

逆序是指链表的值按照逆序的方式来存储,直接两个链表对应节点值相加,记录进位,注意特殊情况,比如链表长短不一,还有可能存在值相加多出一个节点。最长字串寻找中存在一个规律,前一个位置找到的最长字串的位置,当前位置可直接从前一个阻挡的最长字串的位置开始判断,因为之前的已经判断过了。给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。类似于字串匹配,二重循环,遍历每一个元素,对每个元素进行最长字串的寻找。题目类型为大模拟,注意边界信息。

2022-09-30 16:48:31 111

原创 力扣题2022.9.28

因此可以利用哈希表,键为nums元素值,值为nums元素数组索引,一次遍历数组,若哈希表键不存在target-nums[k],则插入(nums[k],k),否则直接返回。给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。把target从未知条件逆向思维,当做已知条件,并且任何顺序返回这个条件表明了双向关系,一个元素没有找到依然可依靠对应的另一个元素。直接双重循环,遍历所有可能的元素组合,找到合适的值返回。

2022-09-28 09:58:49 50

原创 力扣刷题策略

作为一个计算机科学技术研究者,编程能力一定要过硬才行,因为在实际学习工作中难免要进行大量地编程敲代码,而力扣题提供了一个非常好的编程环境锻炼自身的编程能力,尤其是数据结构与算法。算法思想包括定义、边界信息、分治、贪心、动态规划、回溯、分支限界、归纳、逆向。刷题建议按照难度从易到难的顺序进行,即分治、贪心、回溯、分支限界、动态规划、定义、边界信息、归纳、逆向。数据结构包括线性表,栈,队列,串,树,图,查找,排序,哈希表,堆,集合。刷题按照以上顺序刷即可。刷题策略为先刷数据结构,再刷算法思想。

2022-09-28 08:34:59 535

原创 微分方程解法探讨

微分方程较为抽象,且往往结合其他知识点进行隐藏考察,其显式微分方程解法如下。

2022-07-24 13:20:48 113

空空如也

空空如也

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

TA关注的人

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