![](https://img-blog.csdnimg.cn/20201014180756925.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
LeetCode
CodingBoyPP
一个已入职场3年+的小菜鸡,记录平凡的生活。
展开
-
LeetCode 347.前K个高频元素
题目链接: 347.前K个高频元素① 求K个高频元素,首先统计素及对应出现次数,这里使用Map来统计。② 声明小顶堆,遍历Map。需要维护堆大小,如果堆元素数量>k,则将顶元素跳出。原创 2024-04-17 10:55:43 · 233 阅读 · 0 评论 -
LeetCode 155.最小栈
由题意可知,在不影响弹栈顺序的情况下,计算当前栈内最小值。所以我们可以引用多元组的方式在入栈的时候不断记录当前栈内的最小值即可。2.1)多元组的方式实现。2.2)链表方式实现。原创 2024-04-13 16:50:45 · 178 阅读 · 0 评论 -
LeetCode 739. 每日温度
首先声明一个新数组result, 并声明一个单调递增栈(这里找第一个比当前栈顶元素大的,所以使用递增栈)。这里可以使用双指针思路,代码较为简单这里不进行阐述。除了双指针外,还可以使用单调栈的思想。原创 2024-04-13 16:48:05 · 149 阅读 · 0 评论 -
LeetCode 84. 柱状图中最大的矩形
边缘两端也需要进行计算面积,可以声明一个新的数组,左右边界高度为0。遍历数组时,对于元素可分为如下三种情况进行讨论。找到比上一个元素高度低的索引位置,不断进行计算构成矩形的面积,取最大值。这里由于找的是第一个低的位置,所以这里使用单调递减栈(栈顶元素最大,栈底元素最小)。原创 2024-04-13 16:46:01 · 258 阅读 · 0 评论 -
LeetCode 215. 数组中的第K个最大元素
2)当前堆元素个数 = k,且当前元素 > 堆顶元素,则移除堆顶元素,再加入堆中。需要找到第K个最大的元素,这里我们可以使用大顶堆的思路,堆内只维护k个元素。1)当前堆元素个数 < k,且当前元素 > 堆顶元素,则直接进入堆中。3)遍历完数组,第K个最大元素就是大顶堆堆底元素。原创 2024-04-13 15:49:42 · 153 阅读 · 0 评论 -
LeetCode 1222.可以攻击国王的皇后
将国王位置的八个方向进行遍历,当遇到皇后时截断该线路。原创 2024-04-13 10:50:28 · 137 阅读 · 0 评论 -
LeetCode 74.搜索二维矩阵
因为每行是有序的,所以可以使用二分查找。而每列的数据也是有序的,所以这里我们也可以使用二分查找。这里我们可以使用两次二分查找解决该问题,先通过二分法查出target所在行, 再通过二分法查找target对应的行内位置。由题可知,整个数组从上至下,从左至右都是有序的。所以这里我们可以使用二分查找法。通过遍历每行,对行内数据进行二分查找。原创 2024-04-12 17:02:53 · 258 阅读 · 0 评论 -
LeetCode 33.搜索旋转排序数组
升序数组按照某个位置进行了旋转拆分成了两个升序数组。通过二分法不断找到中间位置的数,然后升序的区间快速切掉多余的部分。原创 2024-04-12 16:57:52 · 211 阅读 · 0 评论 -
LeetCode 153.寻找旋转排序数组的最小值
这里用二分法查找,需要始终将目标值(这里是最小值)套住,并不断收缩左边界或右边界。而右原创 2024-04-12 16:54:41 · 170 阅读 · 0 评论 -
LeetCode 51.N皇后
这里需要遍历的深度即是棋盘的行数,每层遍历的长度即是棋盘的列数。所以我们从行数开始遍历,进行放置皇后(需要满足垂直,斜对角不能存在皇后)如果不满足则进行回溯。N皇后问题是一道典型的回溯思想题,知题意,对于N*N的网格中找出满足条件的皇后布局。原创 2024-04-12 16:49:54 · 299 阅读 · 0 评论 -
LeetCode 77.子集 ||
子集问题是回溯的经典题型。题目要求结果集不能存在重复的子集,如果采用先把所有结果给收集起来,然后进行去重,该方法的时间复杂度较高。所以当前在dfs查找前进行剪枝。① 对每层分支集合遍历前,需要进行判断之前的分支是否已经走过。这里为了更好去除重复的分支,需要对原数组进行排序。②进行深度遍历时,需要记录已经使用过的数字。如果当前数字已经使用过,需要进行剪枝。原创 2024-04-12 16:14:31 · 129 阅读 · 0 评论 -
LeetCode 87.复原IP地址
这题是典型的回溯思路,可按DFS进行查找,且当前层从【startIndex, s.length】,下层的遍历区间【startIndex+1, s.length】,且深度最大为4。按题意,是想将一段字符串分为4段子串,且每段子串的区间为0~255。切割问题采用回溯思想,一般使用DFS查找。② 每段区间为0~255。原创 2024-04-12 15:36:09 · 116 阅读 · 0 评论 -
LeetCode 79.单词搜索
这其实就是一道图的DFS查找的问题,那么如何遍历图呢?其实图的遍历过程是二叉树DFS遍历的一个变种。startIndex = s.length代表已经搜索到了,可以返回true。依代码所示,二叉树的遍历过程有两点 :断言操作 ,每层遍历的分支集合。依据递归三要素:递归方法参数及返回值,递归终止条件,回溯搜索过程。遍历整个二维数组,对当前位置的四周开始进行递归。②网格的每个栅格存在4个分支:上下左右四个方向。①对于case断言,当前不能超过网格范围内。1.) 确认递归方法参数及返回值。2) 确认终止条件。原创 2024-04-12 15:32:20 · 252 阅读 · 0 评论 -
LeetCode 131.分割回文串
知题意,将字符串分割成若干个回文串。其实分割问题差不多就是组合问题,依然可以使用回溯思想。原创 2024-04-12 15:02:36 · 285 阅读 · 0 评论 -
LeetCode 17.电话号码的字母组合
① 这里需要得到所有可能结果,一般使用void。我们需要通过index来记录digits所在位置,当遍历完毕则需要添加到结果集中。② 循环的退出条件,既当前遍历path数组的大小等于字符串的长度时,代表已到达最大深度。面对组合问题,采用回溯思想使用DFS遍历。③ 每层的广度优先遍历,即对应数字键的字母。原创 2024-04-12 14:32:30 · 330 阅读 · 0 评论 -
LeetCode 216. 组合总和 III
② 每层的广度优先遍历区间为【1,9】,对于已经使用过的元素需要进行剪枝。① 终止条件下需要加入一个额外Condition:currSum=n。原创 2024-04-12 14:21:48 · 110 阅读 · 0 评论 -
LeetCode 77.组合
因为这里1~n内的数不能重复选取,这里使用start记录当前的数,每层的广度遍历为[start, n]。广度优先遍历区间为【start, n】,再进行下一层遍历前,需要将start+=1。下一层遍历结束后进行回溯start-=1。从n个数内,选择k个数出来,这是一个典型的组合问题。对于回溯递归可以使用递归三部曲。当前已经选择列表数=k时,进行退出。原创 2024-04-12 14:03:21 · 179 阅读 · 0 评论 -
LeetCode 47.全排列II
① 遵循递归公式,选择递归退出条件,path.size=nums.length。这里有重复元素,对于重复元素如何进行剪枝这点弄明白,这道题就迎刃而解了。这里使用一个used数组来记录使用过的元素,在当前层使用完后释放。② 对于每层的广度优先遍历需要过滤掉已经使用过的元素。① 相同层,出现了相同的元素,需要进行剪枝。② 不同层,出现了相同的元素,需要进行剪枝。原创 2024-04-12 12:18:13 · 292 阅读 · 0 评论 -
LeetCode 22.括号生成
① dfs退出条件,right括号数原创 2024-04-12 12:31:59 · 167 阅读 · 0 评论 -
LeetCode 39.组合总和
① 循环的退出条件,累加的数字等于targetNum则追加到结果集,如果大于targetNum则跳出当前层并进行回溯。这里注意一点点,数字可以无限制选取,所以每层的一个广度遍历是一致的,不需要过滤使用过的元素。当curr > target已经超过了目标值,则不符合条件,需要进行回溯;② 每层的循环遍历都是从【0, s.length-1】。当curr = target满足条件,添加至结果集中。组合和排列问题是经典的回溯题,依据递归三部曲。确定递归方法参数及返回值。原创 2024-04-12 12:41:11 · 174 阅读 · 0 评论 -
LeetCode 46.全排列
② 确定每层遍历的广度,这里需要记录之前遍历过的元素,只能从未使用过的元素开始。① 确定递归的终止条件, 即元素个数(也是值深度)为当前列表长度。这是一道典型的回溯排列问题。原创 2024-04-12 12:12:46 · 381 阅读 · 0 评论