数据结构与算法
文章平均质量分 88
Adenialzz
Keep Learning.
展开
-
随机数生成算法:K进制逐位生成+拒绝采样
随机数生成算法:K进制逐位生成+拒绝采样转载 2022-09-18 11:13:03 · 222 阅读 · 0 评论 -
42. 接雨水
42. 接雨水42. 接雨水核心思路首先我们要明确本题的核心思路:逐个计算每个位置处的雨水量再加和,每个位置处的雨水量由它左侧柱子的最高值和右侧柱子的最高值中较小的那一个决定。我们先实现一个暴力的方法,再来逐步优化。暴力方法暴力方法足够暴力,我们从左到右遍历数组,并在每个位置求其左右的最大值,加上它们中较小的那一个:class Solution {public: int trap(vector<int>& height) { int ans = 0;原创 2022-05-21 23:03:52 · 223 阅读 · 0 评论 -
32. 最长有效括号
32. 最长有效括号最长有效括号dp数组含义dp数组中 dp[i]dp[i]dp[i] 表示以下标 iii 结尾的子串的最长有效括号的长度。如 ()()() 的 dp 数组为 [0,2,0,4,0,6][0,2,0,4,0,6][0,2,0,4,0,6] ; ()(()) 的 dp 数组为 [0,2,0,0,2,6][0,2,0,0,2,6][0,2,0,0,2,6] 。状态转移公式如果 s[i]s[i]s[i] 是 ( ,那肯定不可能组成有效数组, dp[i]=0dp[i]=0dp[i]=0原创 2022-05-18 10:36:51 · 115 阅读 · 0 评论 -
LeetCode-10 正则表达式匹配
LeetCode-10 正则表达式匹配动态规划10. 正则表达式匹配dp数组含义:dp[i][j]dp[i][j]dp[i][j] 表示 s[0:i−1]s[0:i-1]s[0:i−1] 能否被 p[0:j−1]p[0:j-1]p[0:j−1] 成功匹配。状态转移方程 :如果 s[i−1]==p[j−1]s[i-1]==p[j-1]s[i−1]==p[j−1] ,那么当前字符是匹配成功了,整个子串是否匹配成功取决于之前的子串能否匹配,即 dp[i][j]=d[i−1][j−1]dp[i][j]=原创 2022-05-10 00:43:02 · 319 阅读 · 0 评论 -
回文子串、回文子序列相关题目
回文子串、回文子序列相关题目回文子串是要连续的,回文子序列可不是连续的。516. 最长回文子序列dp数组含义:dp[i][j]dp[i][j]dp[i][j] 表示子序列 s[i,j]s[i,j]s[i,j] 中的最长回文子序列的长度。dp数组初始化:子序列长度为 1 时,最长回文子序列的长度就是 1, 即s[i,i]=1s[i,i]=1s[i,i]=1递推公式:如果 s[i]==s[j]s[i]==s[j]s[i]==s[j] ,那么相比于 s[i+1,j−1]s[i+1,j-1]s[i+1原创 2022-05-02 23:39:14 · 293 阅读 · 0 评论 -
拓扑排序C++
拓扑排序C++邻接表邻接表,存储方法跟树的孩子链表示法相类似,是一种顺序分配和链式分配相结合的存储结构。如这个表头结点所对应的顶点存在相邻顶点,则把相邻顶点依次存放于表头结点所指向的单向链表中。在有向图中,描述每个点向别的节点连的边(点a->点b这种情况)。在无向图中,描述每个点所有的边(点a-点b这种情况)LeetCode习题207. 课程表解题思路本题可约化为: 课程安排图是否是有向无环图(DAG)。即课程间规定了前置条件,但不能构成任何环路,否则课程前置条件将不成立。原创 2022-04-08 09:01:50 · 3373 阅读 · 0 评论 -
LeetCode上的各种股票最大收益
LeetCode上的各种股票最大收益对于力扣平台上的股票类型的题目:121 买卖股票的最佳时机122 买卖股票的最佳时机 II123 买卖股票的最佳时机 III124 买卖股票的最佳时机 IV309 最佳买卖股票时机含冷冻期714 买卖股票的最佳时机含手续费剑指 Offer 63. 股票的最大利润关键是要仔细分析题意,将每天结束后可能存在的状态列出来,并考虑当天与前一天的可能存在的状态转移的关系。另外要注意初始化和空间复杂度的优化。121. 买卖股票的最佳原创 2022-02-05 20:26:05 · 3055 阅读 · 0 评论 -
关于二分法的边界问题及两种写法
关于二分法的边界问题及两种写法二分查找法大家很熟悉了,对于一个有序序列,我们可以通过二分查找法在 O(logN)O(logN)O(logN) 的时间内找到想要的元素。但是,在代码实现的过程中,如果没有仔细理解清楚,二分法的边界条件有时会让人很头疼,而对边界条件的妥善处理是很能体现一个人的代码功底的,也通常是面试官会很关注的一个点。另外,大佬的题解中的二分法代码也总有几处小细节不同,但是大佬的代码都是怎么测都没问题的,自己却总因为某处细节没有处理好而出现问题。实际上,二分法通常有两种细节略有不同的实现方式原创 2022-02-03 12:20:17 · 5774 阅读 · 3 评论 -
由前中后遍历序列构建二叉树
由前/中/后遍历序列构建二叉树基础首先,我们需要知道前中后序三种深度优先遍历二叉树的方式的具体顺序:前序:中左右中序:左中右后序:左右中另外,要知道只有中序+前/后序可以唯一确定一棵二叉树,而前序+后序是不能唯一确定一棵二叉树的。思路在构造二叉树的题目中,我们通常是采用递归形式的分治思想来实现。在前/后序列中,我们知道其最前/最后的元素一定是根结点,我们将根结点的值取出来,并在中序序列中找到该节点的值(此类题目通常保证遍历序列中无重复元素),并记下其索引。在中序序列中,根结点左右的序列原创 2022-01-26 14:35:10 · 1054 阅读 · 0 评论 -
递归+回溯
递归-回溯 代码随想录本文参考自代码随想录视频:https://www.bilibili.com/video/BV1cy4y167mMhttps://www.bilibili.com/video/BV1ti4y1L7cv递归+回溯理论基础只要有递归,就会有回溯,递归函数的下面的部分通常就是回溯的逻辑。回溯是纯暴力的搜索,有时可以通过剪枝做一些优化。回溯搜索解决的常见问题组合问题切割问题子集问题排列问题棋盘问题如何理解回溯搜索所有的回溯法都可以抽象为一个树形结构原创 2022-01-21 23:14:47 · 833 阅读 · 0 评论 -
二叉树的层序遍历和前中后序遍历代码 迭代/递归
二叉树的层序遍历和前中后序遍历代码 迭代/递归只记录代码。思路参考代码随想录:https://github.com/youngyangyang04/leetcode-master/blob/master/problems/%E4%BA%8C%E5%8F%89%E6%A0%91%E7%9A%84%E8%BF%AD%E4%BB%A3%E9%81%8D%E5%8E%86.md。前中后序遍历(DFS)递归class Solution {private: void postOrder(TreeNod原创 2022-01-17 23:06:10 · 359 阅读 · 0 评论 -
LeetCode-726 原子的数量 递归
LeetCode-726 原子的数量 递归题目链接:LeetCode-726 原子的数量给你一个字符串化学式 formula ,返回 每种原子的数量 。原子总是以一个大写字母开始,接着跟随 0 个或任意个小写字母,表示原子的名字。如果数量大于 1,原子后会跟着数字表示原子的数量。如果数量等于 1 则不会跟数字。例如,“H2O” 和 “H2O2” 是可行的,但 “H1O2” 这个表达是不可行的。两个化学式连在一起可以构成新的化学式。例如 “H2O2He3Mg4” 也是化学式。由括号括起的化学原创 2022-01-15 20:24:06 · 5104 阅读 · 0 评论 -
LeetCode-287 寻找重复数 二分法
LeetCode-287 寻找重复数 二分法287. 寻找重复数给定一个包含 n + 1 个整数的数组 nums ,其数字都在 1 到 n 之间(包括 1 和 n),可知至少存在一个重复的整数。假设 nums 只有 一个重复的整数 ,找出 这个重复的数 。你设计的解决方案必须不修改数组 nums 且只用常量级 O(1) 的额外空间。示例 1:输入:nums = [1,3,4,2,2]输出:2示例 2:输入:nums = [3,1,3,4,2]输出:3示例 3:输入:nums = [原创 2022-01-11 13:27:17 · 3797 阅读 · 0 评论 -
快速排序 C++
快速排序 C++快速排序的思想快速排序是分治思想的典型应用。该排序算法可以原地实现,即空间复杂度为 O(1)O(1)O(1),而时间复杂度为 O(nlogn)O(nlogn)O(nlogn) 。算法将待排序的序列 SSS 分为两个子序列 SLS_LSL 和 SRS_RSR ,随着这种子序列的划分,可以保证问题的规模在不断缩小,即有:max(∣SL∣,∣SR∣)<nmax(|S_L|,|S_R|) < nmax(∣SL∣,∣SR∣)<n并要求左侧子序列 SLS_LSL原创 2021-12-01 18:54:40 · 1152 阅读 · 0 评论