自定义博客皮肤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)
  • 收藏
  • 关注

原创 代码随想录day37 贪心最后一天

3、设置flag,这里的flag是记录从该位置开始,向后的所有数都变成9,因为如果没有这个flag的话,例如1000这个数,本来答案是999,但会变成900。2、从后向前遍历,用i和i-1的数比较,如果后一个数比前一个数小,那么前一个数--,注意这里很关键,一定要--;给定一个非负整数 N,找出小于或等于 N 的最大的整数,同时这个整数需要满足其各个位数上的数字是单调递增。(当且仅当每个相邻位数上的数字 x 和 y 满足 x <= y 时,我们称这个整数是单调递增的。

2024-02-01 11:27:27 356

原创 代码随想录day36 贪心算法重复区间

这题其实和射气球题目很像,也是将intervals先按每个元素第二位从小到大排序,然后判断每个元素的第二位是否小于等于后一元素的第一位,如果小于等于,那么证明不重叠,将两个区间合并,如何大于,那么重叠,直接res++1、找到字符串中每个字母的最大inde:,比如示例a的最大index就是8,这个需要用hash数组,先遍历字符串,然后用hash[s[i] - 'a'] = i;给定一个区间的集合,找到需要移除区间的最小数量,使剩余区间互不重叠。给出一个区间的集合,请合并所有重叠的区间。

2024-01-31 10:36:13 951

原创 代码随想录day35 贪心算法感觉掌握点门道

这题说实话没想出来应该怎么解,卡哥说可以参考分发糖果的方法,但我想这也不能从后向前再遍历呀,于是只能看看视频,原来不是从后向前遍历,而是根据people中每个元素的第一个元素大小进行倒序排序,如果相等的话就比较第二个元素,哪个小哪个排前面,注意这里就是在做局部最优解了,这样排完序后就解决了高矮问题,然后关键点就来了,people里每个元素的第二个元素的大小其实就是其应该插入的位置,因为我们已经倒序排序过了。可以射出的弓箭的数量没有限制。对于每个气球,提供的输入是水平方向上,气球直径的开始和结束坐标。

2024-01-27 23:37:00 840

原创 代码随想录day33 贪心算法进阶

这题很好玩,因为如果一个孩子如果比他左边大也比右边大,那么他得到的糖果需要是左右两边孩子的得到多的糖果的那一方再加1,说起来有点绕,举例就是:[1,3,2,1],这个3的孩子得到的糖果是3,因为他左边孩子得到的是1,右边孩子得到的是2,那么按此逻辑,我们就需要从前往后遍历一遍再从后往前再遍历一遍,这样才能得到准确值。这题其实非常巧妙,我们得用一个特殊的排序方法:把数组按照绝对值从大到小排序,然后遍历数组,碰到负数就把它变成正数,最后如果k没用完,那么就抓着最后一个数(注意不是最后一个负数)进行取反。

2024-01-27 16:31:41 841

原创 代码随想录day32 贪心算法训练

2、即然是求最小步数,那么思路就是取覆盖范围最大的,用双指针的思想,比如2,1,1,4,目前是在2,能走到第一个1也能走到第二个,明显走到第一个1不够到4,要走到第二个1才可以,而且走到第二个1时,覆盖范围变成了3,正好能到最后一位,这时的curCover就变成了nextCover。这题解法其实非常讨巧,举例一个数[1,2,3],可以看出来利润是2,如果从最低点买最高点卖的思路来说,是3-1,但其实也可以变成(2-1)+(3-2),我们可以每天都做交易,只要有利润,如果没利润,那就不卖,

2024-01-21 17:01:10 827

原创 代码随想录day31 贪心算法初探

就像卡哥视频里说的一样,感觉贪心算法确实没什么固定的套路,唯一的思路就是求局部最优解然后推广到全局最优解,但是什么是局部最优解,这个需要慢慢做题来摸索总结,有点像调参,蛮玄学的,纯考脑子。

2024-01-16 23:30:29 1149

原创 代码随想录day30 回溯算法最终章

3、单层递归其实没啥难度,主要是判断当满足题意三个条件时才能纵向递归,注意这里要因为是在二维数组里递归,那么横向遍历的i和纵向递归遍历其实没啥关系,不用startIndex,直接row+1即可。每一种解法包含一个不同的 n 皇后问题 的棋子放置方案,该方案中 'Q' 和 '.' 分别代表了皇后和空位。n 皇后问题 研究的是如何将 n 个皇后放置在 n×n 的棋盘上,并且使皇后彼此之间不能相互攻击。1、要创建的结果数组是三维的,因为棋盘是二维的,要存放棋盘。编写一个程序,通过填充空格来解决数独问题。

2024-01-14 22:53:16 1013

原创 代码随想录day29 回溯开始进入排列问题

这题初看想用子集的方法来做,但是发现存在一个问题,怎么能判断单调递增呢,这里通过一个判断条件,如果遍历的nums[i]大于path.back(),那么证明这个数大于path内所有的数,可以push back,同时我门需要增加一个set,作用是去重,即如果发现遍历的nums[i]不在set里,那么可以push back,因为每次遍历的时候set都要insert nums[i]给定一个整型数组, 你的任务是找到所有该数组的递增子序列,递增子序列的长度至少是2。还要记得将原数组sort一下。

2024-01-13 23:36:10 915

原创 代码随想录day28 回溯算法逐渐摸到点套路

这题其实和组合那题非常像,唯一的区别是,最终结果数组res在每次递归时都要存path,而不能当startIndex == nums.size的时候才存,因为这里对于纵向递归没有任何约束条件,唯一要注意的就是横向遍历时要去重。示例: 输入: nums = [1,2,3] 输出: [ [3], [1], [2], [1,2,3], [1,3], [2,3], [1,2], [] ]2、在纵向递归遍历时,也要判断截取的string合不合题意,如果合题意,那么直接在i+1处加.

2024-01-13 15:42:11 841

原创 代码随想录day27 回溯继续深造,新题型

这题其实和组合总和III非常像,唯一的区别是数字可以无限制重复被选取,那么startIndex就不会作为去重的参数,每次递归都从i开始即可,其余的代码与组合总和III一模一样。给定一个无重复元素的数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。//下一行的去重逻辑是树层去重,used[i-1] == 0是要保证纵向遍历时树枝不去重。示例: 输入: "aab" 输出: [ ["aa","b"], ["a","a","b"] ]

2024-01-12 16:59:33 885

原创 代码随想录day25 回溯算法加强练习

1、要把数字和字母表给对应起来,怎么对应呢,用一个string数组或者vector<string>来存放:{"", "", "abc", "def", "ghi", "jkl", "mno", "pqrs", "tuv", "wxyz"},然后每个数字就相当于数组里的下标。5、横向遍历,注意这里其实就是遍历每个数字对应字符串里的字符,因为path是由digits每个数字对应的字符串取一个字符组成的。示例 2: 输入: k = 3, n = 9 输出: [[1,2,6], [1,3,5], [2,3,4]]

2024-01-11 17:30:01 763

原创 代码随想录day24 开启回溯算法

感觉回溯算法其实和递归很像,也是用递归的做法,也有三部曲,但又不太一样的地方是递归中类似二叉树,只有纵向遍历(一层层往下遍历,没有横向遍历),而回溯算法中多的for循环就是横向遍历,说实话这一点我没有理解的太深,只是知道它类似于两个for循环中的第一个for循环,以后有更深的理解以后再来补全吧,先给出递归三部曲写法:1、确定函数名和参数 void backTracking(参数)2、确定终止条件,并在终止条件里存放结果和returnif(终止条件){存放结果;return;

2024-01-09 23:09:10 490

原创 代码随想录day23 二叉岁终章

这题有个非常大的坑,就是当root小于low或者high时,很多人会把root变为nullptr,但其实在root的左右子树里可能还会有值满足条件,所以不能直接变为nullptr,要一直遍历可能存在的值,即当root小于low时,递归遍历它的右子树,当大于high时,递归遍历它的左子树,并且最后返回它搜索到符合条件的最后值。你可能需要改变树的根节点,所以结果应当返回修剪好的二叉搜索树的新的根节点。本题中,一个高度平衡二叉树是指一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1。

2024-01-08 20:25:24 800

原创 代码随想录day22 二叉树开始进入无固定方法阶段

这题用通用方法二叉树的公共祖先肯定能做,但是既然是二叉搜索树,那么肯定要根据它的特点来解,这个特点就是如果p、q都大于root就搜右子树,小于就搜左子树,因为二叉搜索树左子树元素都小于root,右子树都大于root,那么当p大于root,q小于root或者p小于q大于时,证明要返回的最近公共祖先就是root,因为如果是次近公共祖先的话,肯定满足之前两个条件,还要继续遍历。给定一个二叉搜索树的根节点 root 和一个值 key,删除二叉搜索树中的 key 对应的节点,并保证二叉搜索树的性质不变。

2024-01-08 15:39:03 355

原创 代码随想录day21 二叉搜索树进阶

本题有一种笨办法,就是把二叉树的所有结点都存到一个vector里,因为二叉搜索树是左中右排序单调递增的,所以vector也是单调递增的,然后比较两两差值,或者用卡哥的办法,直接在遍历二叉树的时候就比较,用双指针的办法,慢指针是pre初始为空,快指针是root,遍历一个结点pre和root就往前进一步,关键点是pre前进一步是等于root,注意还是因为二叉搜索树中序遍历是单调递增,那么只要比较相邻两个数的差值就行,所以pre可以一步步等于root。给定 BST [1,null,2,2],

2024-01-06 16:10:42 757 1

原创 代码随想录day20 开始二叉搜索树

开始二叉搜索树啦,其实二叉搜索树定义很简单,一个结点的左子树所有结点都比它小,右子树的所有结点都比它大,本题其实就是找到一个二叉搜索树的子树,如果这个结点大于给定val,那么root = root->right,如果小于,那么root = root->left,如果等于就return root;本题也是通过递归的方式构造二叉树:找到数组中最大的数,然后最大数左部分变成一个数组,右部分变成一个数组,继续node->left、node->right递归两个数组,注意创建左右数组的时候需要跳过node。

2024-01-04 20:23:40 1217 1

原创 代码随想录day18 二叉树开始各种方法尝试

初看有点蒙,感觉无从下手,看完卡哥视频才发现需要找到根结点,那么得从后序数组里找,最后一个数就是根结点,因为从左右中的顺序来说,中在最后,然后再中序数组中找到根结点,把其分为左右两个数组,同时根据中序数组的左右数组来确定后序数组的左右数组,因为左右数组的size都是相等的,这个技巧很关键,接着递归node->left、node->right就好,主要这里node->left、node->right是要等于递归的结果,而不是用if判断。// 第五步:切割后序数组,切成后序左数组和后序右数组。

2024-01-03 16:46:03 902 1

原创 代码随想录day17 二叉树的高度与深度

看到题目中这图就能发现,用层序不行,得用前序遍历,但存在一个问题,判断完一条路径后怎么回到根结点判断另一条路径呢,这里就要用到回溯的思想,不能等到遍历到底了再回头,得遍历一个结点就回头一次,用vector把遍历过的结点都存起来,并且用到递归的思想,向左时递归左边,向右时递归右边,当向左与向左都为空时,就把vector里的元素拼接成一个string。本题用层序遍历就能解了,但需要注意的是这里是左叶子,也就是在node->left时要判断它的左右子树都为空才能算作左叶子。说明: 叶子节点是指没有子节点的节点。

2024-01-02 16:21:46 727 1

原创 代码随想录day16 层序遍历接着干

本题思想依旧是层序遍历,只是这里并不是要遍历所有层(只有当是满二叉树时才需要),顺着这个思路想,如果有一个结点它的左右孩子都为空时,那么证明这个结点已经到底了,最小深度就是这个结点的深度,不管它是不是所处在最后一层。示例: 给定二叉树 [3,9,20,null,null,15,7],返回它的最大深度 3。和上题一样,有多少层深度就是多少,注意这里用for循环把n叉树所有结点都遍历到。最大深度是指从根节点到最远叶子节点的最长路径上的节点总数。二叉树的深度为根节点到最远叶子节点的最长路径上的节点数。

2023-12-28 11:39:10 846 1

原创 代码随想录Day15 二叉树进入层序遍历阶段

3、确定queue的存取方式,即每次size-1时都从queue取一个元素出来,然后将这个元素的左右孩子放进queue里,注意因为queue是先进先出,那么当size=0时正好把每一层的元素都取完,虽说当时queue里的元素不为空。2、进入循环,条件是queue不为空,接下来是关键,设一个变量size等于queue的size,接着再接一个循环size--,这里size的目的是为了把二叉树每一层元素的个数都用size表示出来,即确定每一层要循环多少次。// 每一层的size要记录,相当于每一层遍历的次数。

2023-12-27 19:14:33 712 1

原创 代码随想录day14 二叉树初探

在我看来二叉树其实是非常底层的数据结构,很多stl函数里的核心其实都是二叉树的结构,例如map、set等,说实话我对于二叉树的理解还不是很深,只是简单掌握一些二叉树的运用方法,下面讲讲我的理解:1、二叉树的种类:满二叉树(所有结点全部 填满,数量为2的n次方减一)、完全二叉树(最底层的结点不用填满,但必须先填满左结点)、二叉搜索树(有值的二叉树)、平衡二叉搜索树(左右子树的高度差不超过1的二叉搜索树)2、二叉树的储存方式:容器储存(数组)、链式储存。

2023-12-26 20:20:38 797 1

原创 代码随想录day13 队列有点难

2、这里的pop和push有说法,要重新定义,主要目的是将deque变成一个单调递减的队列,即front大back小,要做到这一点,首先push时就要判断,即然是单调递减,那么push进来的数如果比back大,那么就pop_back(注意,这里要用while,因为可能不止pop一次),然后再push这个数;1、先明确大体思路,先创建deque,然后遍历数组,向deque里push至nums[k-1],接下来就是pop一个数push一个数。给定一个非空的整数数组,返回其中出现频率前 k 高的元素。

2023-12-25 22:24:35 756

原创 代码随想录day11 栈与队列进阶

本题之前做过一次,解题思路其实很简单:创建一个stack,遍历字符串,在遇到 (、{、[ 的时候就分别push )、}、],否则遇到其他的判断如果stack.top与字符不相等就pop,需要格外注意的就是这一点,因为有类似这种情况"([)]"的情况,最后判断stack是否为空即可(为空就是true),这题属于stack最基础最本质题目。=stk.top()关键,保证了按先进后出的次序pop。给定一个只包括 '(',')','{','}','[',']' 的字符串,判断字符串是否有效。string stk;

2023-12-25 09:53:24 770

原创 代码随想录day10 栈和队列初探

这题之前没做,想了很久以为需要用两个栈来做,其实没那么复杂,用一个栈即可完成,自己也先将代码给写出来了:就是将栈顶部的元素依次放入底部,每遍历一次就pop一下,遍历的次数为 size() -1(注意这里尤为关键,因为原先栈最底部的元素不用再操作了);遍历完后弹出queue.front()即可,top就更简单,直接返回queue.back()(因为返回的是栈顶元素);push(x) -- 将一个元素放入队列的尾部。peek() -- 返回队列首部的元素。pop() -- 从队列首部移除元素。

2023-12-22 14:25:37 760

原创 代码随想录day9 KMP算法整晕了

后面看了卡哥讲解的KMP算法,说实话有点整晕了,归纳了下在本题中应用大致就是先把needle的最长相等前后缀数组next给算出来,然后应用kmp算法的思想比较haysatck和needle字符:遍历haystack,while j>0 && haystack[i]!说实话,晕了,完全没搞明白怎么用KMP做,后面看卡哥视频讲解才知道在求出next数组后,字符串的长度如果能整除字符串中不包含最长公共前后缀的那一部分长度,则证明该字符串由字串重复两次构成,需要再多看多领悟,KMP算法还是没搞太懂。

2023-12-21 23:15:15 994 1

原创 代码随想录day8 字符串,字符串!

i+=(2*k)),这里就解决了计数2k个字符的问题,另外还需要把最后 [n*2k, s.length()-1]个数进行判断,这里需要先判断 i+k是否小于s.length()-1。看到题目第一反应是遍历到空格时将单词存下来,但发现需要考虑的因素太多了,比如存完第一个单词后第二个单词从什么时候开始,因为单词间可能会存在多个空格的情况,后看卡哥视频才顿悟,可以先把string全部翻转,那么再从翻转的后string遍历到单词时将其翻转就是所需要的string;输入字符串以字符数组。

2023-12-21 10:36:30 860 1

原创 代码随想录day7 哈希进阶

这题其实延续了两数相加的思想,也是创建map保存某一个或者两个数相加的和以及这个和出现的次数,然后再在下一个数组中判断map里有没有target - nums[i],复杂的是这题要先在map里保存两个数组nums1、nums2相加的key和value,然后再在下两个数组nums3、nums4里寻找符合target-nums3[i] - nums4[j]的value有多少;

2023-12-20 12:01:30 693 1

原创 代码随想录day6 哈希初探

初看题目,有相同字符和出现次数两个关键词,想用map将两个数组的关键词都存下来,然后遍历map来比较,感觉比较麻烦但思路OK,后面看讲解视频发现还可以用数组来做,因为关键是题目说明string里只有小写字母,则用 hash(s[i]-'a') 可以表示 s[i] 在长度为26的hash数组里出现的位置,随后将遍历两个string将hash数组++,--,最后判断hash数组里的元素是否全为0即可(其实我觉得用map的方法比较通用hhh)1、一个数的每个位置上的数字,需要用n%10来表示。

2023-12-19 15:44:21 824 1

原创 代码随想录day4 链表进阶

对于交换指针来说,需要使用虚拟头结点的方法,因为需要知道要交换元素的前一个元素是啥,继而连接到其下一个元素,另外,按照图中所示,当虚拟头结点连接到2前,要把1、3都保存下来,因为链路会断。从上述等式中可以看出,x比z多了n-1个环的路程,也就是说,从头结点出发一个指针,从相遇节点 也出发一个指针,这两个指针每次只走一个节点, 那么当这两个指针相遇的时候就是环形入口的节点,那么在两指针相遇时可以设pos1 = head;// 快指针走两步,慢指针走一步,这样快比慢每次只多一步,在套圈的过程中不会漏掉慢指针。

2023-12-18 20:09:02 965

原创 代码随想录day3 链表初探

1、在原链表上直接删除,这种方法需要注意单独判断头节点是不是val,因为我们正常删除节点的方法是找到其上一个节点,让上一个节点指向其下一个节点,然后再删除(1->2->3,要删除2则必须将1指向3),而头节点前面没有节点,所以当头节点是val时则需要做head = head->next的操作,另外还需要注意,该方法是需要用两个while来做循环遍历。示例: 输入: 1->2->3->4->5->NULL 输出: 5->4->3->2->1->NULL。//如果index小于0,则在头部插入节点。

2023-12-15 22:32:42 880

原创 代码随想录day2 数组进阶

给你一个按排序的整数数组nums,返回组成的新数组,要求也按排序平方后,数组变为 [16,1,0,9,100],排序后,数组变为 [0,1,9,16,100]

2023-12-14 20:44:11 825

原创 代码随想录打卡第一天:初探数组

给定一个n个元素有序的(升序)整型数组nums和一个目标值target,写一个函数搜索nums中的target,如果目标值存在返回下标,否则返回-1。

2023-12-13 23:26:41 792 1

空空如也

空空如也

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

TA关注的人

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