自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 代码随想录阅读笔记-贪心算法【柠檬水找零】

这道题目可以告诉大家,遇到感觉没有思路的题目,可以静下心来把能遇到的情况分析一下,只要分析到具体情况了,一下子就豁然开朗了。此时大家就发现 情况一,情况二,都是固定策略,都不用我们来做分析了,而唯一不确定的其实在情况三。所以局部最优:遇到账单20,优先消耗美元10,完成本次找零。这道题目刚一看,可能会有点懵,这要怎么找零才能保证完成全部账单的找零呢?而情况三逻辑也不复杂甚至感觉纯模拟就可以了,其实情况三这里是有贪心的。在柠檬水摊上,每一杯柠檬水的售价为 5 美元。只需要维护三种金额的数量,5,10和20。

2024-04-28 10:27:44 126

原创 代码随想录阅读笔记-贪心算法【分发糖果】

如果 ratings[i] > ratings[i + 1],此时candyVec[i](第i个小孩的糖果数量)就有两个选择了,一个是candyVec[i + 1] + 1(从右边这个加1得到的糖果数量),一个是candyVec[i](之前比较右孩子大于左孩子得到的糖果数量)。如果ratings[i] > ratings[i - 1] 那么[i]的糖 一定要比[i - 1]的糖多一个,所以贪心:candyVec[i] = candyVec[i - 1] + 1。再确定左孩子大于右孩子的情况(从后向前遍历)

2024-04-28 10:10:36 511

原创 代码随想录阅读笔记-贪心算法【加油站】

在一条环路上有 N 个加油站,其中第 i 个加油站有汽油 gas[i] 升。你有一辆油箱容量无限的的汽车,从第 i 个加油站开往第 i+1 个加油站需要消耗汽油 cost[i] 升。你从其中的一个加油站出发,开始时油箱为空。如果你可以绕环路行驶一周,则返回出发时加油站的编号,否则返回 -1。示例 2: 输入:输出: -1解释: 你不能从 0 号或 1 号加油站出发,因为没有足够的汽油可以让你行驶到下一个加油站。我们从 2 号加油站出发,可以获得 4 升汽油。

2024-04-24 12:20:46 500

原创 代码随想录阅读笔记-贪心算法【K次取反后最大化的数组和】

那么又是一个贪心:局部最优:只找数值最小的正整数进行反转,当前数值和可以达到最大(例如正整数数组{5, 3, 1},反转1 得到-1 比 反转5得到的-5 大多了),全局最优:整个 数组和 达到最大。那么如果将负数都转变为正数了,K依然大于0,此时的问题是一个有序正整数序列,如何转变K次正负,让 数组和 达到最大。贪心的思路,局部最优:让绝对值大的负数变为正数,当前数值达到最大,整体最优:整个数组和达到最大。虽然这道题目大家做的时候,可能都不会去想什么贪心算法,一鼓作气,就AC了。

2024-04-23 21:06:51 150

原创 代码随想录阅读笔记-贪心算法【跳跃游戏 II】

给定一个非负整数数组,你最初位于数组的第一个位置。数组中的每个元素代表你在该位置可以跳跃的最大长度。你的目标是使用最少的跳跃次数到达数组的最后一个位置。说明: 假设你总是可以到达数组的最后一个位置。与上题思路是相似的,还是要看最大覆盖范围。本题要计算最少步数,那么就要想清楚什么时候步数才一定要加一呢?贪心的思路,局部最优:当前可移动距离尽可能多走,如果还没到终点,步数再加一。整体最优:一步尽可能多走,从而达到最少步数。

2024-04-23 20:42:53 690

原创 代码随想录阅读笔记-贪心算法【跳跃游戏】

思路也很简单,也是覆盖域的思想,我的做法是把每个位置能达到的位置索引放到一个集合中,遍历完除最后一个元素外数组中所有元素后形成一个到达集合,即这个数组所有能到达的索引集,接着判断能否到达最后一个位置的条件为集合中存在从1到最后一个位置的索引n之间的所有位置,故再使用一次遍历即可达到目标,但是我这样的做法在leetcode上无法通过,会存在一些测例会超时,其实原因也很简单,我这个方法需要遍历两遍数组,并且在构建到达索引集合时还嵌套循环了,时间复杂度为n平方级别,所以很容易便超时了。

2024-04-21 14:01:42 359

原创 代码随想录阅读笔记-贪心算法【买卖股票的最佳时机 II】

给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格。设计一个算法来计算你所能获取的最大利润。你可以尽可能地完成更多的交易(多次买卖一支股票)。注意:你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。想获得利润至少要两天为一个交易单元。

2024-04-21 10:40:32 773

原创 代码随想录阅读笔记-贪心算法【最大子数组和】

给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。

2024-04-20 14:20:57 239

原创 代码随想录阅读笔记-贪心算法【摆动序列】

如果连续数字之间的差严格地在正数和负数之间交替,则数字序列称为摆动序列。第一个差(如果存在的话)可能是正数或负数。少于两个元素的序列也是摆动序列。例如, [1,7,4,9,2,5] 是一个摆动序列,因为差值 (6,-3,5,-7,3) 是正负交替出现的。相反, [1,4,7,2,5] 和 [1,7,4,5,5] 不是摆动序列,第一个序列是因为它的前两个差值都是正数,第二个序列是因为它的最后一个差值为零。给定一个整数序列,返回作为摆动序列的最长子序列的长度。

2024-04-20 13:04:28 794

原创 代码随想录阅读笔记-贪心算法【分发饼干】

从代码中可以看出我用了一个 index 来控制饼干数组的遍历,遍历饼干并没有再起一个 for 循环,而是采用自减的方式,这也是常用的技巧。这个例子可以看出饼干 9 只有喂给胃口为 7 的小孩,这样才是整体最优解,并想不出反例,那么就可以撸代码了。这种写法,两个循环的顺序改变了,先遍历的饼干,在遍历的胃口,这是因为遍历顺序变了,我们是从小到大遍历。大尺寸的饼干既可以满足胃口大的孩子也可以满足胃口小的孩子,那么就应该优先满足胃口大的。然后从后向前遍历小孩数组,用大饼干优先满足胃口大的,并统计满足小孩数量。

2024-04-19 12:07:06 377

原创 代码随想录阅读笔记-回溯【解数独】

编写一个程序,通过填充空格来解决数独问题。一个数独的解法需遵循如下规则: 数字 1-9 在每一行只能出现一次。数字 1-9 在每一列只能出现一次。数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。空白格用 '.' 表示。一个数独。答案被标成红色。棋盘搜索问题可以使用回溯法暴力搜索,只不过这次我们要做的是。怎么做二维递归呢?。

2024-04-18 10:45:36 275

原创 代码随想录阅读笔记-回溯【N皇后】

n 皇后问题 研究的是如何将 n 个皇后放置在 n×n 的棋盘上,并且使皇后彼此之间不能相互攻击。给你一个整数 n ,返回所有不同的 n 皇后问题 的解决方案。每一种解法包含一个不同的 n 皇后问题 的棋子放置方案,该方案中 'Q' 和 '.' 分别代表了皇后和空位。都知道n皇后问题是回溯算法解决的经典问题,但是用回溯解决多了组合、切割、子集、排列问题之后,遇到这种二维矩阵还会有点不知所措。确定完约束条件,来看看究竟要怎么去搜索皇后们的位置,其实搜索皇后的位置,可以抽象为一棵树。

2024-04-18 10:09:26 508

原创 代码随想录阅读笔记-回溯【重新安排行程】

给定一个机票的字符串二维数组 [from, to],子数组中的两个成员分别表示飞机出发和降落的机场地点,对该行程进行重新规划排序。所有这些机票都属于一个从 JFK(肯尼迪国际机场)出发的先生,所以该行程必须从 JFK 开始。直觉上来看 这道题和回溯法没有什么关系,更像是图论中的深度优先搜索。实际上确实是深搜,但这是深搜中使用了回溯的例子,在查找路径的时候,如果不回溯,怎么能查到目标路径呢。所以倾向于说本题应该使用回溯法,那么用回溯法的思路来讲解本题,其实深搜一般都使用了回溯法的思路。

2024-04-17 19:36:05 706

原创 代码随想录阅读笔记-回溯【全排列 II】

大家应该很清晰的看到,树层上对前一位去重非常彻底,效率很高,树枝上对前一位去重虽然最后可以得到答案,但是做了很多无用搜索。图中我们对同一树层,前一位(也就是nums[i-1])如果使用过,那么就进行去重。给定一个可包含重复数字的序列 nums ,按任意顺序 返回所有不重复的全排列。在组合总和以及子集问题中我们分别详细讲解了组合问题和子集问题如何去重。这是为什么呢,就是上面我刚说的,如果要对树层中前一位去重,就用。来来来,我就用输入: [1,1,1] 来举一个例子。,如果要对树枝前一位去重用。

2024-04-16 12:48:35 391

原创 代码随想录阅读笔记-回溯【全排列】

给定一个 没有重复 数字的序列,返回其所有可能的全排列。示例。

2024-04-15 22:25:25 234

原创 代码随想录阅读笔记-回溯【非递减子序列】

题目给定一个整型数组, 你的任务是找到所有该数组的递增子序列,递增子序列的长度至少是2。示例:说明:思路 这个递增子序列比较像是取有序的子集。而且本题也要求不能有相同的递增子序列。在上一道子集题目中我们是通过排序,再加一个标记数组来达到去重的目的。而本题求自增子序列,是不能对原数组进行排序的,排完序的数组都是自增子序列了。所以不能使用之前的去重逻辑!本题给出的示例,还是一个有序数组 [4, 6, 7, 7],这更容易误导大家按照排序的思路去做了。为了有鲜明的对比,我用[4, 7, 6, 7]这个数组来举例,

2024-04-15 09:31:00 264

原创 代码随想录阅读笔记-回溯【子集II】

从图中可以看出,同一树层上重复取2 就要过滤掉,同一树枝上就可以重复取2,因为同一树枝上元素的集合才是唯一子集!本题也可以不使用used数组来去重,因为递归的时候下一个startIndex是i+1而不是0。给定一个可能包含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集)。如果要是全排列的话,每次要从0开始遍历,为了跳过已入栈的元素,需要使用used。这道题目和上一道子集的题目区别就是集合里有重复元素了,而且求取的子集要去重。的基础上加上了去重,去重我们在​​​​​​​。使用set去重的版本。

2024-04-13 19:37:34 384

原创 代码随想录阅读笔记-回溯【子集】

给定一组不含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集)。说明:解集不能包含重复的子集。示例:输入: nums = [1,2,3]输出: [ [3], [1], [2], [1,2,3], [1,3], [2,3], [1,2], [] ]求子集问题和组合问题以及切割回文子串问题又不一样了。如果把 子集问题、组合问题、分割问题都抽象为一棵树的话,其实子集也是一种组合问题,因为它的集合是无序的,子集{1,2} 和 子集{2,1}是一样的。

2024-04-13 16:22:50 365

原创 代码随想录阅读笔记-回溯【复原IP地址】

给定一个只包含数字的字符串,复原它并返回所有可能的 IP 地址格式。有效的 IP 地址 正好由四个整数(每个整数位于 0 到 255 之间组成,且不能含有前导 0),整数之间用 '.' 分隔。例如:"0.1.2.201" 和 "192.168.1.1" 是 有效的 IP 地址,但是 "0.011.255.245"、"192.168.1.312" 和 "[email protected]" 是 无效的 IP 地址。这道题目大家仔细分析就能意识到这是切割问题,,和上一道回文子串题目就十分类似了。

2024-04-13 15:57:05 802

原创 代码随想录阅读笔记-回溯【分割回文串】

在处理组合问题的时候,递归参数需要传入startIndex,表示下一轮递归遍历的起始位置,这个startIndex就是切割线。

2024-04-12 21:13:06 732

原创 代码随想录阅读笔记-回溯【组合总和II】

给定一个数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。candidates 中的每个数字在每个组合中只能使用一次。说明: 所有数字(包括目标数)都是正整数。解集不能包含重复的组合。。一些同学可能想了:我把所有组合求出来,再用set或者map去重,这么做很容易超时!所以要在搜索的过程中就去掉重复组合。

2024-04-12 19:59:20 560

原创 代码随想录阅读笔记-回溯【组合总和】

题目给定一个无重复元素的数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。candidates 中的数字可以无限制重复被选取。说明:思路 本题和之前的组合以及组合总和问题区别是:本题没有数量要求,可以无限重复,但是有总和的限制,所以间接的也是有个数的限制。本题搜索的过程抽象成树形结构如下:注意图中叶子节点的返回条件,因为本题没有组合数量要求,仅仅是总和的限制,所以递归没有层数的限制,只要选取的元素总和超过target,就返回!1

2024-04-11 10:40:04 521

原创 代码随想录阅读笔记-回溯【电话号码的字母组合】

给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。说明:尽管上面的答案是按字典序排列的,但是你可以任意选择答案输出的顺序。

2024-04-11 09:38:30 677

原创 代码随想录阅读笔记-回溯【组合总和III】

找出所有相加之和为 n 的 k 个数的组合。组合中只允许含有 1 - 9 的正整数,并且每种组合中不存在重复的数字。示例 1: 输入: k = 3, n = 7 输出: [[1,2,4]]示例 2: 输入: k = 3, n = 9 输出: [[1,2,6], [1,3,5], [2,3,4]]本题就是在[1,2,3,4,5,6,7,8,9]这个集合中找到和为n的k个数的组合。相对于上一道组合的题目,无非就是多了一个限制,本题是要找到和为n的k个数的组合,而整个集合已经是固定的了[1,...,9]

2024-04-10 10:05:37 685

原创 代码随想录阅读笔记-回溯【组合】

给定两个整数 n 和 k,返回 1 ... n 中所有可能的 k 个数的组合。示例: 输入: n = 4, k = 2 输出: [ [2,4], [3,4], [2,3], [1,2], [1,3], [1,4], ]本题是回溯法的经典题目。直接的解法当然是使用for循环,例如示例中k为2,很容易想到 用两个for循环,这样就可以输出 和示例中一样的结果。这时便需要用到回溯搜索法,虽然回溯法也是暴力,但至少能写出来,不像for循环嵌套k层让人绝望。那么回溯法怎么暴力搜呢?上面我们说了。

2024-04-09 15:02:47 739

原创 代码随想录阅读笔记-二叉树【总结】

在二叉树题目选择什么遍历顺序是不少同学头疼的事情,我们做了这么多二叉树的题目了,给大家大体分分类。涉及到二叉树的构造,无论普通二叉树还是二叉搜索树一定前序,都是先构造中节点。求普通二叉树的属性,一般是后序,一般要通过递归函数的返回值做计算。求二叉搜索树的属性,一定是中序了,要不白瞎了有序性了。注意在普通二叉树的属性中,我用的是一般为后序,例如单纯求深度就用前序,​​​​​​​代码随想录阅读笔记-二叉树【二叉树的所有路径】-CSDN博客也用了前序,这是为了方便让父节点指向子节点。

2024-04-09 09:35:33 929

原创 代码随想录阅读笔记-二叉树【二叉搜索树转换为累加树】

给出二叉 搜索 树的根节点,该树的节点值各不相同,请你将其转换为累加树(Greater Sum Tree),使每个节点 node 的新值等于原树中大于或等于 node.val 的值之和。提醒一下,二叉搜索树满足下列约束条件:节点的左子树仅包含键 小于 节点键的节点。节点的右子树仅包含键 大于 节点键的节点。左右子树也必须是二叉搜索树。一看到累加树,相信很多小伙伴都会疑惑:如何累加?遇到一个节点,然后再遍历其他节点累加?怎么一想这么麻烦呢。然后再发现这是一棵二叉搜索树,这是有序的啊。

2024-04-09 09:02:04 584

原创 代码随想录阅读笔记-二叉树【将有序数组转换为二叉搜索树】

2、确定递归终止条件这里定义的是左闭右闭的区间,所以当区间 left > right的时候,就是空节点了。

2024-04-08 14:26:49 528

原创 代码随想录阅读笔记-二叉树【修剪二叉搜索树】

给定一个二叉搜索树,同时给定最小边界L 和最大边界 R。通过修剪二叉搜索树,使得所有节点的值在[L, R]中 (R>=L)。你可能需要改变树的根节点,所以结果应当返回修剪好的二叉搜索树的新的根节点。相信看到这道题目大家都感觉是一道简单题(事实上leetcode上也标明是简单)。但真的需要大家在很多方面考虑清楚。

2024-04-08 14:08:11 424

原创 代码随想录阅读笔记-二叉树【删除二叉搜索树节点】

读完本篇,大家会发现二叉搜索树删除节点比增加节点复杂的多。因为二叉搜索树添加节点只需要在叶子上添加就可以的,不涉及到结构的调整,而删除节点操作涉及到结构的调整。这里我们依然使用递归函数的返回值来完成把节点从二叉树中移除的操作。这里最关键的逻辑就是第五种情况(删除一个左右孩子都不为空的节点),这种情况一定要想清楚。而且就算想清楚了,对应的代码也未必可以写出来,所以这道题目既考察思维逻辑,也考察代码能力。递归中我给出了两种写法,推荐大家学会第一种(利用搜索树的特性)就可以了,第二种递归写法其实是比较绕的。

2024-04-07 11:04:02 480

原创 代码随想录阅读笔记-二叉树【二叉搜索树的插入】

给定二叉搜索树(BST)的根节点和要插入树中的值,将值插入二叉搜索树。返回插入后二叉搜索树的根节点。输入数据保证,新值和原始二叉搜索树中的任意节点值都不同。注意,可能存在多种有效的插入方式,只要树在插入后仍保持为二叉搜索树即可。你可以返回任意有效的结果。这道题目其实是一道简单题目,,瞬间感觉题目复杂了很多。其实如下演示视频中可以看出:只要按照二叉搜索树的规则去遍历,遇到空节点就插入节点就可以了。例如插入元素10 ,需要找到末尾节点插入便可,一样的道理来插入元素15,插入元素0,插入元素6,

2024-04-07 09:28:40 833

原创 代码随想录阅读笔记-二叉树【二叉搜索树的最近公共祖先】

给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先。百度百科中最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。例如,给定如下二叉搜索树: root = [6,2,8,0,4,7,9,null,null,3,5]通过上个博客可以知道,利用回溯从底向上搜索,遇到一个节点的左子树里有p,右子树里有q,那么当前节点就是最近公共祖先。

2024-04-06 13:59:14 919

原创 代码随想录阅读笔记-二叉树【二叉树的最近公共祖先】

那么我们来说一说,如果 root == q,或者 root == p,说明找到 q p ,则将其返回,这个返回值,后面在中节点的处理过程中会用到,那么中节点的处理逻辑,下面讲解。但我们还要返回最近公共节点,可以利用上题目中返回值是TreeNode * ,那么如果遇到p或者q,就把q或者p返回,返回值不为空,就说明找到了q或者p。判断逻辑是 如果递归遍历遇到q,就将q返回,遇到p 就将p返回,那么如果 左右子树的返回值都不为空,说明此时的中节点,一定是q 和p 的最近祖先。

2024-04-06 10:25:55 874

原创 代码随想录阅读笔记-二叉树【二叉搜索树中的众数】

本题在递归法中,给出了如果是普通二叉树,应该怎么求众数。知道了普通二叉树的做法时候,再进一步给出二叉搜索树又应该怎么求众数,这样鲜明的对比,相信会对二叉树又有更深层次的理解了。在递归遍历二叉搜索树的过程中还介绍了一个统计最高出现频率元素集合的技巧, 要不然就要遍历两次二叉搜索树才能把这个最高出现频率元素的集合求出来。为什么没有这个技巧一定要遍历两次呢?因为要求的是集合,会有多个众数,如果规定只有一个众数,那么就遍历一次稳稳的了。

2024-04-05 10:46:17 849

原创 代码随想录阅读笔记-二叉树【二叉搜索树的最小绝对差】

一些同学不知道在递归中如何记录前一个节点的指针,其实实现起来是很简单的,大家只要看过一次,写过一次,就掌握了。给你一棵所有节点为非负值的二叉搜索树,请你计算树中任意两节点的差的绝对值的最小值。看过二叉树的迭代遍历以及统一迭代法之后,不难写出两种中序遍历的迭代法。需要用一个pre节点记录一下cur节点的前一个节点。提示:树中至少有 2 个节点。

2024-04-05 10:01:00 176

原创 代码随想录阅读笔记-二叉树【验证二叉搜索树】

给定一个二叉树,判断其是否是一个有效的二叉搜索树。要知道下,输出的二叉搜索树节点的数值是有序序列。有了这个特性,

2024-04-04 21:08:51 974

原创 代码随想录阅读笔记-二叉树【二叉搜索树中的搜索】

给定二叉搜索树(BST)的根节点和一个值。你需要在BST中找到节点值等于给定值的节点。返回以该节点为根的子树。如果节点不存在,则返回 NULL。例如,在上述示例中,如果要找的值是 5,但因为没有节点值为 5,我们应该返回 NULL。之前我们讲的都是普通二叉树,那么接下来看看二叉搜索树。大家可以参考这个博客加深对二叉搜索树的理解这就决定了,二叉搜索树,递归遍历和迭代遍历和普通二叉树都不一样。本题,其实就是在二叉搜索树中搜索一个节点。那么我们来看看应该如何遍历。

2024-04-04 19:54:29 374

原创 代码随想录阅读笔记-二叉树【合并二叉树】

给定两个二叉树,想象当你将它们中的一个覆盖到另一个上时,两个二叉树的一些节点便会重叠。你需要将他们合并为一个新的二叉树。合并的规则是如果两个节点重叠,那么将他们的值相加作为节点合并后的新值,否则不为 NULL 的节点将直接作为新二叉树的节点。示例 1:注意: 合并必须从两个树的根节点开始。相信这道题目很多人疑惑的点是如何同时遍历两个二叉树呢?其实和遍历一个树逻辑是一样的,只不过传入两个树的节点,同时操作。同样是递归和迭代两种思路。

2024-04-03 18:21:48 439

原创 代码随想录阅读笔记-二叉树【最大二叉树】

题目中说了输入的数组大小一定是大于等于1的,所以我们不用考虑小于1的情况,那么当递归遍历的时候,如果传入的数组大小为1,说明遍历到了叶子节点了。那么应该定义一个新的节点,并把这个数组的数值赋给新的节点,然后返回这个节点。以上代码比较冗余,效率也不高,每次还要切割的时候每次都要定义新的vector(也就是数组),但逻辑比较清晰。(1)先要找到数组中最大的值和对应的下标, 最大的值构造根节点,下标用来下一步分割数组。参数传入的是存放元素的数组,返回该数组构造的二叉树的头结点,返回类型是指向节点的指针。

2024-04-03 15:18:00 402

原创 代码随想录-二叉树【从中序与后序遍历序列构造二叉树】

下面给出用下标索引写出的代码版本:(思路是一样的,只不过不用重复定义vector了,每次用下标索引来分割)

2024-04-02 19:11:04 676

空空如也

空空如也

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

TA关注的人

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