![](https://img-blog.csdnimg.cn/20201014180756922.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
LeetCode
文章平均质量分 93
指北针_N
共同进步,顶峰相见。
展开
-
《剑指Offer》笔记&题解&思路&技巧&优化——精心编写(2)
为了方便阅读,完整笔记分为两篇文章,第(1)篇题目为1-38题,第(2)篇题目为39-75题。所有题目均来自《剑指 Offer(第 2 版)》。截止到编写文章时,所有题解代码均可通过LeetCode在线评测,即AC。笔记中一些题目给出了多种题解和思路,笔记中大多数题解都是较为完美的解法,消耗时间和空间较少。由于作者水平有限,欢迎大家指教,共同交流学习。最后祝大家刷题愉快。原创 2023-03-28 18:00:00 · 1304 阅读 · 1 评论 -
《剑指Offer》笔记&题解&思路&技巧&优化——精心编写(1)
LeetCode,剑指Offer,算法题,笔试面试,秋招,春招。《剑指Offer》笔记&题解&思路&技巧&优化——精心编写。为了方便阅读,完整笔记分为两篇文章,第(1)篇题目为1-38题,第(2)篇题目为39-75题。所有题目均来自《剑指 Offer(第 2 版)》。截止到编写文章时,所有题解代码均可通过LeetCode在线评测,即AC。笔记中一些题目给出了多种题解和思路,本笔记大多数题解都是较为完美的解法,消耗时间和空间较少。由于作者水平有限,欢迎大家指教,共同交流学习。最后祝大家刷题愉快。原创 2023-03-21 20:45:00 · 1006 阅读 · 0 评论 -
LeetCode力扣刷题——更加复杂的数据结构
更加复杂的数据结构,并查集,LRU最近最少使用。目前为止,我们接触了大量的数据结构,包括利用指针实现的三剑客和 C++ 自带的 STL 等。树可以看成是一个连通且 无环 的 无向 图。我们采用一个链表 list> 来储存信息的 key 和 value,链表的链接顺序即为最 近使用的新旧顺序,最新的信息在链表头节点。同时我们需要一个嵌套着链表的迭代器的 unordered_map>::iterator> 进行快速搜索,调用链表的 splice 函数来直接更新查找成功(cash hit)时的信息原创 2022-11-20 18:50:31 · 1031 阅读 · 0 评论 -
LeetCode力扣刷题——指针三剑客之三:图
图,图论,二分图,拓扑排序,最短路径。作为指针三剑客之三,图是树的升级版。图通常分为有向(directed)或无向(undirected),有 循环(cyclic)或无循环(acyclic),所有节点相连(connected)或不相连(disconnected)。树即是 一个相连的无向无环图,而另一种很常见的图是有向无环图(Directed Acyclic Graph,DAG)。有向无环图样例图通常有两种表示方法,邻接矩阵,邻接表(邻接链表)。原创 2022-11-19 21:30:00 · 714 阅读 · 0 评论 -
LeetCode力扣刷题——指针三剑客之二:树
树,树的递归,树的前序中序后序遍历,二叉查找树,二叉搜索树,BST,字典树,前缀树。作为(单)链表的升级版,我们通常接触的树都是二叉树(binary tree),即每个节点最多有 两个子节点;且除非题目说明,默认树中不存在循环结构。其与链表的主要差别就是多了一个子节点的指针。原创 2022-11-19 20:15:00 · 681 阅读 · 0 评论 -
LeetCode力扣刷题——指针三剑客之一:链表
单链表,链表是由节点和指针构成的数据结构,每个节点存有一个值,和一个指向下一个节点 的指针,因此很多链表问题可以用递归来处理。不同于数组,链表并不能直接获取任意节点的值, 必须要通过指针找到该节点后才能获取其值。同理,在未遍历到链表结尾时,我们也无法知道链 表的长度,除非依赖其他数据结构储存长度。LeetCode 默认的链表表示方法如下。int val;};由于在进行链表操作时,尤其是删除节点时,经常会因为对当前节点进行操作而导致内存或 指针出现问题。原创 2022-11-13 20:00:20 · 1066 阅读 · 0 评论 -
LeetCode力扣刷题——令人头大的字符串
字符串比较,字符串理解,字符串匹配,同构字符串,回文子串。使用著名的Knuth-Morris-Pratt(KMP)算法,可以在 O(m + n) 时间利用动态规划完成匹配。我们可以将问题转化一下:记录两个字符串每个位置的字符第一次出现的位置,如果两个字 符串中相同位置的字符与它们第一次出现的位置一样,那么这两个字符串同构。由于乘除优先于加减计算,因此不妨考虑先进行所有乘除运算,并将这些乘除运算后的整数值放回原表达式的相应位置,。原创 2022-11-12 20:40:49 · 237 阅读 · 0 评论 -
LeetCode力扣刷题——妙用数据结构
Sequence Containers:维持顺序的容器。Container Adaptors:基于其它容器实现的数据结构。Associative Containers:实现了排好序的数据结构。Unordered Associative Containers,数据结构,C++ STL,数组,栈和队列,优先队列,双端队列,哈希表,多重集合和映射,前缀和与积分图。在刷题时,我们几乎一定会用到各种数据结构来辅助我们解决问题,因此我们必须熟悉各种 数据结构的特点。C++ STL 提供的数据结构包括原创 2022-11-09 17:15:39 · 1144 阅读 · 0 评论 -
LeetCode力扣刷题——神奇的位运算
位运算。位运算是算法题里比较特殊的一种类型,它们利用二进制位运算的特性进行一些奇妙的优化和计算。常用的位运算符号包括:“∧”按位异或、“&”按位与、“|”按位或、“∼”取反、“”算术右移。无论整数是有符号的还是无符号的,其内部的二进制表示形式都是相同的。位运算是算法题里比较特殊的一种类型,它们利用二进制位运算的特性进行一些奇妙的优化和计算。同时,我们可以建立一个哈希表来存储字母串(在数组的位置)到二进制数字的映射关系,方便查找调用。原创 2022-10-30 21:30:00 · 217 阅读 · 0 评论 -
LeetCode力扣刷题——巧解数学问题
数论,数学,数学问题。随机产生一个数字,然后使用二分法查找其在前缀和中的位置,以模拟加权采样的过程。例如,对于 w = [1, 3],挑选下标 0 的概率为 1 / (1 + 3) = 0.25 (即,25%),而选取下标 1 的概率为 3 / (1 + 3) = 0.75(即,75%)。然而很多数学题的解法并不通用,我们也很难在几道题里把所有的套路讲清楚,因此我们只选择了几道经典或是典型的题目,供大家参考。链表中所有节点被选中的概率相等。给你一个单链表,随机选择链表的一个节点,并返回相应的节点值。原创 2022-10-24 20:30:00 · 968 阅读 · 0 评论 -
LeetCode力扣刷题——化繁为简的分治法
分治法,分治思想。两部分组成,通过把原问题分为子问题,再将子问题进行处理合并,从而实现对原问题的求解。我们在排序章节展示的归并排序就是典型的分治问题,其中“分”即为把大数组平均分成两个小数组,通过递归实现,最终我们会得到多个长度为 1。给你一个由数字和运算符组成的字符串 expression ,按不同优先级组合数字和运算符,计算并返回所有可能组合的结果。利用分治思想,我们可以把加括号转化为,对于每个运算符号,先执行处理两侧的数学表达式,再处理此运算符号。的数组的时间复杂度,则归并排序的时间复杂度递推公式为。原创 2022-10-23 20:00:00 · 185 阅读 · 0 评论 -
LeetCode力扣刷题——深入浅出动态规划
动态规划,dp问题,一维动态规划,二维动态规划,股票问题,背包问题,字符串编辑,空间压缩技巧。状态记录(memoization)的优先搜索。用带有状态记录的优先搜索是自上而下的,即从父问题搜索到子问题,若重复搜索到同一个子问题则进行状态记录,防止重复计算。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。,此时可以抢劫的最大数量有两种可能,一种是我们选择不抢劫这个房子,此时累计的金额即为 dp[i-1];原创 2022-10-17 19:00:07 · 360 阅读 · 0 评论 -
LeetCode力扣刷题——一切皆可搜索
搜索、深度优先搜索dfs、广度优先搜索bfs、回溯法、n皇后问题、岛屿问题。因为栈与递归的调用原理相同,而递归相对便于实现,因此刷题时笔者推荐使用递归式写法,同时也方便进行回溯(见下节)。我们从 1 号节点开始遍历,假如遍历顺序是从左子节点到右子节点,那么按照优先向着“广”的方向前进的策略,队列顶端的元素变化过程为 [1]->[2->3]->[4],图的表示方法是,每个位置代表一个节点,每个节点与上下左右四个节点相邻。原创 2022-10-12 16:35:33 · 778 阅读 · 0 评论 -
LeetCode力扣刷题——千奇百怪的排序算法
LeetCode力扣,排序算法。快速排序,桶排序,冒泡排序,选择排序,归并排序。先找一个中枢点(pivot),然后遍历其他数字,小于 pivot 的排左边,大于 pivot 的排右边,中枢点是数组中的第几小的数字就确定了,如果 pivot 与 target 相等,直接返回pivot 位置的数字,如果大于 target ,说明要求的数字在左边部分,否则在右边部分。快速排序,而且刷题时很少需要自己手写排序算法,但是熟习各种排序算法可以加深自己对算法的基本理解,以及解出由这些排序算法引申出来的题目。请注意,你需原创 2022-09-26 20:00:00 · 503 阅读 · 0 评论 -
LeetCode力扣刷题——居合斩!二分查找
LeetCode刷题,二分法,折半法,二分查找,折半查找。第二是在刷题时思考如果最后区间只剩下一个数或者两个数,自己的写 法是否会陷入死循环,如果某种写法无法跳出死循环,则考虑尝试另e一种写法。具体到代码上,二分查找时区间的左右端取开区间还是闭区间在绝大多数时候都可以,因此。二分查找也可以看作双指针的一种特殊情况,但我们一般会将二者区分。二分到了不能再分的情况,如只剩一个数字,且剩余区间里不存在满足条件的解,则说明不存在。指针通常是一步一步移动的,而在二分查找里,指针每次移动半个区间长度。原创 2022-09-24 20:00:00 · 477 阅读 · 0 评论 -
LeetCode力扣刷题——玩转双指针
LeetCode刷题,双指针问题。如果两个指针指向元 素的和大于给定值,我们把右边的指针左移一位,使得当前的和减少一点。为了应对这种情况,nums1 的初始长度为 m + n,其中前 m 个元素表示应合并的元素,后 n 个元素为 0 ,应忽略。因为数组已经排好序,我们可以采用方向相反的双指针来寻找这两个数字,一个初始指向最 小的元素,即数组最左边,向右遍历;给你两个按 非递减顺序 排列的整数数组 nums1 和 nums2,另有两个整数 m 和 n ,分别表示 nums1 和 nums2 中的元素数目。原创 2022-09-20 19:30:00 · 441 阅读 · 0 评论 -
LeetCode力扣刷题——简单易懂的贪心算法
贪心策略:本题是要维持一个非递减的数列,所以遇到递减的情况时(nums[i] > nums[i + 1]),要么将前面的元素缩小,要么将后面的元素放大。问题是维持非递减的数列,那么我们需要尽可能的让前面的数字变小,然后寻找可以让前面数字变小的条件即可,其余的就让后面数字变大就好了。返回你能获得的 最大 利润。(1)最优子结构:规模较大的问题的解由规模较小的子问题的解组成,规模较大的问题的解只由其中一个规模较小的子问题的解决定;采用贪心的策略,保证每次操作都是局部最优的,从而使最后得到的结果是全局最优的。原创 2022-09-18 15:36:01 · 677 阅读 · 0 评论