自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 代码随想录算法训练营Day38|动态规划理论基础、2.斐波那契数、3.爬楼梯、4.使用最小花费爬楼梯

动态规划(Dynamic Programming,简称DP)是一种算法设计技术,它通过将复杂问题分解为更小的子问题来解决优化问题。动态规划通常用于解决那些具有重叠子问题和最优子结构特性的问题。(可以理解为一种递推)

2024-06-14 14:40:21 840

原创 代码随想录算法训练营Day37|56.合并区间、738.单调递增的数字、968.监控二叉树

和之前的思路类似,先创建一个ans二维数组,创建start和end来指明添加进入ans数组的区间下标,先对数组按照首元素排序从小到大排序后,根据当前元素是否小于下一个元素的第一个元素来决定将这个对ans数组进行增加、移动下标或改变end。具体代码如下。算法的时间复杂度为O(nlogn),空间复杂度为O(n)。代码随想录中代码。

2024-06-13 19:52:12 218

原创 代码随想录算法训练营Day36|860.柠檬水找零、406.根据身高重建队列、452.用最少的箭引爆气球

由于付账的bills数组是有顺序的,当顾客支付5美元时,我们收下5美元,当顾客支付10美元时,我们返还5美元,当顾客支付20美元时,我们可以返还一张10美元、1张5美元或者三张5美元,因此,我们需要2个变量存储拥有的5美元和10美元的数量,并根据bills数组进行变量的改变,当变量存在负值时,说明找零失败,return false。算法的时间复杂度为O(n),遍历一次bills数组。空间复杂度为O(1),只需维护2个计数器。

2024-06-12 16:10:00 266

原创 代码随想录算法训练营Day35|K次取反后最大化的数组和、134.加油站、135.分发糖果

贪心算法,将所有的负值取反后,若剩余k为偶数,则不变,得到的为最大值,若为奇数,则将取反后数组中最小的元素取反,计算得到最大值。这里使用了两次排序,第一次排序后将小于等于k次数的负数取反,得到数组中所有值求绝对值的和,之后再排一次序,则数组第一个元素为最小的元素,此时若剩余的k为奇数,则和减去2倍该元素,并返回和,否则直接返回和。算法的时间复杂度为O(nlogn),遍历一次数组,两次排序,综合为O(nlogn)。空间复杂度为O(1)。

2024-06-11 19:44:26 235

原创 代码随想录算法训练营Day32|122.买卖股票的最佳时机II、55.跳跃游戏、45.跳跃游戏II

这里我的贪心策略是,判断今天和前一天的股票差值,若差值大于0,则说明能获益,即卖出,每天都比较一次,将所有差值相加即为最终能获得的最大收益。算法的时间复杂度为O(n),仅遍历一次数组。算法的空间复杂度为O(1),只需维护常数项的空间。

2024-06-08 20:18:03 207

原创 代码随想录算法训练营day31|455.分发饼干、376.摆动序列、53.最大子序和

贪心算法,让每个饼干给到能够满足的孩子,所以需要对饼干尺寸和孩子的满足值先进行排序,然后针对每一个饼干的尺寸,挑选恰好能够满足的孩子(这里表述可能不准确,即从大到小,都选择能够满足的孩子,满足后结果返回值加1),这里选用while循环比较简单,具体代码如下。算法的时间复杂度为O(nlogn),排序需要O(nlogn),循环遍历一次需要O(n),总体需要O(nlogn)的复杂度,空间复杂度考虑排序需要的空间O(logn),其余所需的空间为O(1),所以空间复杂度应该为O(logn)。

2024-06-07 22:54:27 456

原创 代码随想录算法训练营day29|491.递增子序列、46.全排列、47.全排列II

非递减子序列,则答案的子集中,需保持下一个元素大于等于前一个元素的顺序,由于题目中指出,所有的子序列长度需大于等于2,考虑当条件为path.size()>1时,进行收获结果,且需要注意,这时不应该直接return,因为后续仍有可能存在子序列长度大于2的结果,仍需要继续遍历。此时结束的标志是单层遍历的结束。

2024-06-05 21:32:16 712

原创 代码随想录算法训练营day28|93.复原IP地址、78.子集、90.子集II

不合法的IP地址,首字母为0且长度不为1,数字超出255,递归深度为3(4个小字段构成一个合法的IP地址)没写出来,贴一下代码随想录的结果。与上题相比,需要去重,排除由于相同元素带来的相同项。和之前组合总和的去重类似。具体的东西周末再补。

2024-06-04 23:21:18 206

原创 代码随想录算法训练营Day27|39.组合总和、40.组合总和II、131.分割回文串

组合总和,这里有几点需要考虑,一是允许数字的重复使用,即相比于之前的组合,我们的start无需从索引的下一位开始,二是回溯中的返回,当总和等于target时,收获currentPath 需要返回,其次,若总和大于target时也要返回。三是考虑到要求和,尽量需要先将比较小的数字加入,所以在回溯前,考虑对数组进行排序,方便回溯。具体代码如下。算法的时间复杂度为O(n * 2^n),最坏的情况下,我们需要遍历所有可能的组合。

2024-06-03 20:59:35 392

原创 代码随想录算法训练营Day25|216.组合总和III、17.电话号码的字母组合

思路和昨日的组合题类似,但注意对回溯算法中,收获时的条件需要写对,path的长度要为k的同时,path中元素总和要为n。算法的时间复杂度,在最差的情况需,我们需要生成所有C(9,n)个组合,并且对于每个组合,都需要进行k层递归,因此时间复杂度为O(C(9,n)*n)。空间复杂度考虑递归栈,递归栈的最大深度为n,每个组合需要n个元素的存储空间,隐形空间复杂度是O(n)。

2024-06-01 17:37:29 442

原创 代码随想录算法训练营day24|回溯理论基础、77.组合

回溯算法是一种试探性的算法,用于解决组合优化问题。这类问题通常涉及在给定的候选集中找出满足特定条件的所有解。回溯算法通过深度优先遍历的方式,探索决策树的所有可能分支,从而找出所有解,就树而言,我们很容易想到递归,递归和回溯是相辅相成的。回溯法要解决的问题都能抽象成树形结构,也以此,回溯算法的基本思想是,从树的根节点开始,按某种顺序尝试所有可能的选择(例如,从左到右)。每做出一个选择,就生成一个新的节点,然后递归地继续进行选择。

2024-05-31 22:15:26 424

原创 代码随想录Day23|669.修建二叉搜索树、108.将有序数组转换为二叉搜索树、538.把二叉搜索树转换为累加树

在给定二叉搜索树的根节点root的同时,给定最小边界low和最大边界high,通过修剪二叉搜索树,使得所有节点值在[low,high]中。

2024-05-30 17:10:22 255

原创 代码随想录算法训练营Day22|235.二叉搜索树的最近公共祖先、701.二叉搜索树中的插入操作、450.删除二叉搜索树中的节点

不考虑二叉搜索树这一条件的话,普通的二叉搜索树搜索最近的公共祖先就是昨日的做法,这种做法也能解决二叉搜索树的最近公共祖先。没有用上二叉搜索树这一条件,但也能解题,但效率较低。针对二叉搜索树,我们之前有做过,当对二叉搜索树进行中序编历时,结果是一个递增的数组。即公共祖先,val值必定处于p和q之间。当从根节点向下遍历的过程中,如果遇到节点val值位于p和q之间,那么就寻找到了最近的公共祖先。具体参考代码随想录B站视频。二叉搜索树找祖先就有点不一样了!

2024-05-29 21:14:01 1156

原创 代码随想录算法训练营day21|530.二叉搜索树的最小绝对值差、501.二叉搜索树中的众数、236.二叉树的最近公共祖先

首先需考虑这是一个二叉搜索树,在中序遍历后的结果为从小到大的一个序列,寻找二叉搜索树的最小绝对值差,只需比较一个节点与之后的差值即可。在遍历的过程中,我们需要一个节点保存前节点,之后计算前节点和当前节点的差值,将所有节点都遍历一遍后即可得到二叉搜索树的最小绝对值差。算法的时间复杂度和空间复杂度为O(n)。

2024-05-28 19:48:56 688

原创 代码随想录算法训练营day20|654.最大二叉树、617.合并二叉树、700.二叉搜索树中的搜索、98.验证二叉搜索树

和昨日的依据后序和中序序列得到前序二叉树的例子相似,利用递归算法,每个递归体中查找数组中的最大值的位置,将序列分为左右,当传入数组大小为1时,传回以这个数组唯一元素构建的结点。具体写法如下。优化后的写法算法的事件和空间复杂度均为O(n)。

2024-05-27 16:34:38 423

原创 代码随想录算法训练营day18|513.找树左下角的值、112.路径总和、113.路径总和ii、106.从中序与后序遍历序列构建二叉树、105.从前序与中序遍历序列构建二叉树

考虑遍历数的每一层,最下层的最左边元素就是树左下角的值。简单的层序遍历,在对每层遍历时都将第一个节点的值更新为返回值ans,最后返回ans。算法时间复杂度和空间复杂度均为O(n)。

2024-05-25 22:30:54 276

原创 代码随想录算法训练营day17|110.平衡二叉树、257二叉树的所有路径、404.左叶子之和 C++

递归,对左右子树的深度进行计算,每当左右子树深度相差大于1时,即不平衡。具体参考代码随想录。算法的时间复杂度和空间复杂度为O(n)。

2024-05-24 21:05:15 157

原创 代码随想录算法训练营day16|104.二叉树的最大深度、559.n叉树的最大深度、111.二叉树的最小深度、222.完全二叉树的节点个数

今天这些题目用层序遍历都能很快解决,但效率一般。首先需要明确几个知识点。:(一般采用前序遍历方式):(一般采用后序遍历方式)

2024-05-23 19:10:26 748

原创 代码随想录算法训练营Day15|102.层序遍历、226.翻转二叉树、101.对称二叉树 C++

利用队列这个数据结构,每次存入一层的节点地址。当需要得知每层的值时,将队列中的元素全部出队,并将地址所指向节点的val值插入一个一维数组进行保存,然后将所有节点的左节点和右节点(若存在)全部依次入队。若队列为空,则说明逐层遍历完成。代码如下。代码的时间复杂度和空间复杂度均为O(n)

2024-05-22 18:58:12 210

原创 代码随想录算法训练营day14|二叉树的递归遍历、二叉树的迭代遍历、二叉树的统一迭代法

首先需要明确的一点是,前序中序和后序在二叉树的递归遍历中的区别仅在于递归函数中操作的顺序,前序是在遍历一个节点的左右子树前进行操作,中序是在遍历一个节点的左子树后进行操作再遍历右子树,而后序是在遍历完左右子树再进行操作。所以在递归函数中,仅是顺序的差别。

2024-05-21 20:15:00 681

原创 代码随想录算法训练营day13|239.滑动窗口最大值、347.前K个高频元素

会超时,计算每个窗口内最大值,并将其加入最后的窗口最大值数组。这里我有使用一些剪枝,但仍会超时。具体代码如下。算法的时间复杂度为O(n*k),空间复杂度为O(n-k+1),简化为O(n)。

2024-05-20 18:02:51 905

原创 代码随想录 哈希表总结 C++

什么时候需要考虑使用哈希表呢?针对一个集合,我们若想快速判断一个元素是否存在于这个集合中时,就应当考虑哈希法。(如查找一个key值是否在我们想要的集合中:学生名是否在学校的名单里)哈希表查找key的时间复杂度为O(1),可以近似为随机读取。当使用哈希表来解决问题时,一般有三种选择:1.数组,如要区分一个仅包含小写字母字符串s中各字符的数目,可以使用s[i] - 'a'(ascii码的妙用),将其映射到为索引0-25的一个数组上,这种映射方式是有效且高效的。有效的字母异位词。数组,简单哈希表。

2024-05-19 18:46:28 537

原创 代码随想录算法训练营第十一天|20.有效的括号、1047.删除字符串中的所有相邻重复项、150.逆波兰表达式求值

考虑创建一个char栈,当遍历字符串时,若发现左括号,则作入栈操作,当发现右括号时,首先考虑栈是否为空,非空的情况下与栈顶的元素进行比对,若能构成一对有效括号,则弹出该栈顶元素,否则返回false,若最终所有入栈左括号均能匹配有效的右括号(最终栈为空),则字符串中括号有效。算法的时间复杂度为O(n),空间复杂度为O(n)。

2024-05-18 18:38:53 303

原创 代码随想录算法训练营Day10|232.用栈实现队列、225用队列实现栈 C++

栈是一种特殊的。

2024-05-17 17:24:21 587

原创 代码随想录算法训练营第九天|28.实现strStr()、459.重复的子字符串

考虑创建两个指针i,j,i用于遍历文本串haystack,j用于循环遍历目标串needle,i和j都从0开始,当循环过程中,每个字符都能完全对上,则返回i,表示找到了字符串中第一个匹配项的下标。否则返回-1。具体代码如下。算法的时间复杂度O(m*n),m为目标串(模式串)长度,n为文本串长度。空间复杂度为O(1)。

2024-05-16 23:11:59 125

原创 代码随想录训练营第八天|344.反转字符串、541.反转字符串II、卡码网:54.替换数字、151.反转字符串里的单词、卡码网:55.右旋转字符串

不考虑使用vector自带的reverse,字符串可以按数组方式进行操作,创建两个指针left和right指向头字母和尾字母,在while(right>left)循环体中,交换s[left]和s[right],并更新left和right,left++,right--。算法时间复杂度为O(n),空间复杂度为O(1)。

2024-05-15 19:48:19 382

原创 代码随想录算法训练营第七天|454.四数相加、383.赎金信、15.三数之和、18.四数之和

之后再遍历一遍数组,寻找numsmap中与数组元素相反的键及其值,这里就出现了去重的问题,去重有2个,一是数组中的重,如数组如果全为0,则只需考虑一种结果,二是numsmap中的重,如考虑三个键值对{0:[-1,1]}{0:[-2,2]}和{0:[-1,1]},只需考虑{0:[-1,1]}和{0:[-2,2]}。也可不加,不过会减慢效率,此外,考虑到这个四数相加的结果可能超出int范围,将四数相加的结果保存为long,这里卡了我很久,如果不保存为long,leetcode大概会在280+停止。

2024-05-14 19:25:43 685

原创 代码随想录算法训练营第六天|242.有效的字母异位词、349两个数组的交集、202快乐数、1.两数之和

针对字符串s,遍历s,对s中出现的每个字母更新数组(ivect[i]++),之后遍历t,对t中出现的每个字母(ivect[i]--),若最后数组全为0,则为字母异位词,返回true,否则返回false。这里考虑题目是当已经有一个元素,要去寻找是否存在另一个元素也在这个数组中,实现这两个元素相加为target,考虑这一要求,我们需要去查询一个元素是否在一个集合中,考虑使用哈希表。算法的时间复杂度为O(nlogn)(sort快排O(nlogn),比较为O(n),综上为O(nlogn)),空间复杂度为O(1)。

2024-05-13 19:01:03 379

原创 代码随想录算法训练营第四天|24.两两交换链表中的节点、19.删除链表的倒数第N个节点、面试题 02.07.链表相交、142.环形链表II、链表总结 C++

我认为链表有几个重要的点需要考虑:1.链表的增删,对链表的增删需要查找到需要增加或删除结点的前一个结点a,应确保不断链的情况下,对链表进行操作,对增加结点new来说,需要先将增加结点的next指针指向a->next,之后让a的next指针指向结点new。对于删除操作来说,需要当前结点a的next指向被删除结点的next,对于C++语言,需要释放被删除结点占用的空间(delete)。此外,对链表的增删需要考虑增删的结点是否为头结点,加入虚拟头结点可以很好的统一这个操作。

2024-05-11 22:21:31 555

原创 代码随想录算法训练营第三天|203.移除链表元素、707.设计链表、206.反转链表

以C++为例,若使用结构定义,需一个val和指向下一个结点的指针*next,若不存在下一个结点,*next指向NULL或nullptr(c++)。//数据成员int val;//该结点上的值//指向下一个结点的指针//方法ListNode(int x): val(x), next(NULL){}//结点的构造函数。

2024-05-10 22:29:45 825

原创 代码随想录算法训练营第二天| 977.有序数组的平方、209.长度最小的子数组 59.螺旋矩阵ii C++

(错误的预设前提,考虑[4,6,1,8,1],target = 10)想法二:完整数组的和一定是最大的,i,j分别表示数组头和数组尾的索引,值为0和nums.size()-1,考虑从数组和中删去nums[i]和nums[j]中较小数值的索引,并更新i和j,并不断继续,当两侧都无法删除时,得到一个最接近的子数组,但我不能确认是否为长度最小的子数组。算法的时间复杂度考虑STL库中排序方法,为O(nlogn),空间复杂度对排序来说为O(logn),对存储来说为O(n),考虑较大值,我认为是O(n)。

2024-05-09 21:29:50 877

原创 代码随想录算法训练营第一天| 704.二分查找、27.移除元素 C++

区间定义的把握(循环不变量原则):主要为2种,左闭右闭([left, right])或是左闭右开([left,right)),需提前确认,以确定上述重难点的分歧。以左闭右闭情况为例,在搜索开始的区域,left = 0, right = nums.size()-1,需考虑while循环条件的合法性,当区间为[1,1]时,区间中仅存在[1]一个元素,此时while(left<right)不合法,但while(left<=right)合法。

2024-05-08 20:25:41 554

空空如也

空空如也

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

TA关注的人

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