![](https://img-blog.csdnimg.cn/20210131213136934.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
数据结构与算法
--
野草说技术
这个作者很懒,什么都没留下…
展开
-
数据结构与算法大纲
数据结构与算法大纲原创 2023-09-25 21:21:57 · 79 阅读 · 0 评论 -
算法练习17——罗马数字转整数
写做 II ,即为两个并列的 1。I 可以放在 V (5) 和 X (10) 的左边,来表示 4 和 9。X 可以放在 L (50) 和 C (100) 的左边,来表示。的左边,所表示的数等于大数 5 减小数 1 得到的数值 4。通常情况下,罗马数字中小的数字在大的数字的右边。但也存在特例,例如 4 不写做 IIII,而是 IV。C 可以放在 D (500) 和 M (1000) 的左边,来表示 400 和 900。罗马数字包含以下七种字符: I, V, X, L,C,D 和 M。原创 2024-05-07 22:51:14 · 281 阅读 · 0 评论 -
算法练习16——O(1) 时间插入、删除和获取随机元素
int getRandom() 随机返回现有集合中的一项(测试用例保证调用此方法时集合中至少存在一个元素)。bool insert(int val) 当元素 val 不存在时,向集合中插入该项,并返回 true;否则,返回 false。bool remove(int val) 当元素 val 存在时,从集合中移除该项,并返回 true;否则,返回 false。你必须实现类的所有函数,并满足每个函数的 平均 时间复杂度为 O(1)。哈希表实现插入和删除的O(1),变长数组实现随机读取的O(1)原创 2023-10-18 22:09:55 · 299 阅读 · 0 评论 -
算法练习15——加油站
在一条环路上有 n 个加油站,其中第 i 个加油站有汽油 gas[i] 升。你有一辆油箱容量无限的的汽车,从第 i 个加油站开往第 i+1 个加油站需要消耗汽油 cost[i] 升。你从其中的一个加油站出发,开始时油箱为空。给定两个整数数组 gas 和 cost ,如果你可以按顺序绕环路行驶一周,则返回出发时加油站的编号,否则返回 -1。如果存在解,则 保证 它是 唯一 的。原创 2023-10-18 21:56:14 · 343 阅读 · 1 评论 -
算法练习14——除自身以外数组的乘积
给你一个整数数组 nums,返回 数组 answer ,其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积。题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。请 不要使用除法,且在 O(n) 时间复杂度内完成此题。进阶:你可以在 O(1) 的额外空间复杂度内完成这个题目吗?( 出于对空间复杂度分析的目的,输出数组 不被视为 额外空间。原创 2023-10-17 22:34:16 · 337 阅读 · 0 评论 -
算法练习13——H 指数
给你一个整数数组 citations ,其中 citations[i] 表示研究者的第 i 篇论文被引用的次数。计算并返回该研究者的 h 指数。根据维基百科上 h 指数的定义:h 代表“高引用次数” ,一名科研人员的 h 指数 是指他(她)至少发表了 h 篇论文,并且每篇论文 至少 被引用 h 次。如果 h 有多种可能的值,h 指数 是其中最大的那个。原创 2023-10-15 10:18:36 · 213 阅读 · 0 评论 -
算法练习13——跳跃游戏II
给定一个长度为 n 的 0 索引整数数组 nums。初始位置为 nums[0]。每个元素 nums[i] 表示从索引 i 向前跳转的最大长度。换句话说,如果你在 nums[i] 处,你可以跳转到任意 nums[i + j] 处:i + j < n返回到达 nums[n - 1] 的最小跳跃次数。生成的测试用例可以到达 nums[n - 1]。原创 2023-10-15 01:05:53 · 529 阅读 · 0 评论 -
算法练习12——跳跃游戏
给你一个非负整数数组 nums ,你最初位于数组的 第一个下标。数组中的每个元素代表你在该位置可以跳跃的最大长度。判断你是否能够到达最后一个下标,如果可以,返回 true;否则,返回 false。原创 2023-10-10 22:13:27 · 325 阅读 · 0 评论 -
算法练习11——买卖股票的最佳时机 II
状态 dp[i][j] 定义如下:dp[i][j] 表示到下标为 i 的这一天,持股状态为 j 时,我们手上拥有的最大现金数。注意:限定持股状态为 j 是为了方便推导状态转移方程,这样的做法满足 无后效性。其中:第一维 i 表示下标为 i 的那一天( 具有前缀性质,即考虑了之前天数的交易 );第二维 j 表示下标为 i 的那一天是持有股票,还是持有现金。这里 0 表示持有现金(cash),1 表示持有股票(stock)。原创 2023-10-10 21:04:33 · 276 阅读 · 0 评论 -
算法练习10——数组为空的最少操作次数
请你返回使数组为空的 最少 操作次数,如果无法达成,请返回 -1。从数组中选择 两个 值 相等 的元素,并将它们从数组中 删除。从数组中选择 三个 值 相等 的元素,并将它们从数组中 删除。给你一个下标从 0 开始的正整数数组 nums。我的超长代码,没有下面这个sort就超时了…完美避免了冗长的代码。原创 2023-10-01 14:29:31 · 263 阅读 · 0 评论 -
算法练习9——收集元素的最少操作次数
由于元素范围在 [1,50][1,50][1,50],我们可以用一个 646464 位整数表示集合。一次操作中,你可以将数组的最后一个元素删除,将该元素添加到一个集合中。上面的计数数组就是一个哈希表map,本题正好可以使用bit压缩数组。请你返回收集元素 1, 2, …, k 需要的 最少操作次数。给你一个正整数数组 nums 和一个整数 k。原创 2023-10-01 14:22:13 · 208 阅读 · 0 评论 -
算法练习8——有序三元组中的最大值
请你从所有满足 i < j < k 的下标三元组 (i, j, k) 中,找出并返回下标三元组的最大值。如果所有满足条件的三元组的值都是负数,则返回 0。下标三元组 (i, j, k) 的值等于 (nums[i] - nums[j]) * nums[k]。给你一个下标从 0 开始的整数数组 nums。原创 2023-10-01 13:46:52 · 385 阅读 · 0 评论 -
算法练习7——买卖股票的最佳时机
给定一个数组 prices ,它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。你只能选择 某一天 买入这只股票,并选择在 未来的某一个不同的日子 卖出该股票。设计一个算法来计算你所能获取的最大利润。返回你可以从这笔交易中获取的最大利润。如果你不能获取任何利润,返回 0。原创 2023-09-30 15:18:47 · 203 阅读 · 0 评论 -
算法练习6——旋转数组
输入: nums = [1,2,3,4,5,6,7], k = 3。输入:nums = [-1,-100,3,99], k = 2。向右轮转 1 步: [7,1,2,3,4,5,6]向右轮转 2 步: [6,7,1,2,3,4,5]向右轮转 3 步: [5,6,7,1,2,3,4]向右轮转 1 步: [99,-1,-100,3]向右轮转 2 步: [3,99,-1,-100]输出: [5,6,7,1,2,3,4]输出:[3,99,-1,-100]原创 2023-09-30 14:38:50 · 142 阅读 · 0 评论 -
算法练习5——多数元素
给定一个大小为 n 的数组 nums ,返回其中的多数元素。多数元素是指在数组中出现次数 大于 ⌊ n/2 ⌋ 的元素。你可以假设数组是非空的,并且给定的数组总是存在多数元素。原创 2023-09-29 13:51:17 · 158 阅读 · 0 评论 -
算法练习4——删除有序数组中的重复项 II
给你一个有序数组 nums ,请你 原地 删除重复出现的元素,使得出现次数超过两次的元素只出现两次 ,返回删除后数组的新长度。不要使用额外的数组空间,你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下完成。看了看评论区题解,发现常数可以从2开始,然后代码可以更加精简。快慢指针(单向遍历双指针)原创 2023-09-29 12:17:09 · 197 阅读 · 0 评论 -
算法练习3——删除有序数组中的重复项
给你一个 非严格递增排列 的数组 nums ,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。元素的 相对顺序 应该保持 一致。然后返回 nums 中唯一元素的个数。更改数组 nums ,使 nums 的前 k 个元素包含唯一元素,并按照它们最初在 nums 中出现的顺序排列。nums 的其余元素与 nums 的大小不重要。原创 2023-09-28 21:49:31 · 249 阅读 · 0 评论 -
算法练习2——移除元素
给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度。链接:https://leetcode.cn/problems/remove-element/不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并 原地 修改输入数组。商业转载请联系作者获得授权,非商业转载请注明出处。元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。来源:力扣(LeetCode)原创 2023-09-27 21:54:26 · 117 阅读 · 0 评论 -
算法练习1——合并两个有序数组
给你两个按 非递减顺序 排列的整数数组 nums1 和 nums2,另有两个整数 m 和 n ,分别表示 nums1 和 nums2 中的元素数目。请你 合并 nums2 到 nums1 中,使合并后的数组同样按 非递减顺序 排列。注意:最终,合并后数组不应由函数返回,而是存储在数组 nums1 中。为了应对这种情况,nums1 的初始长度为 m + n,其中前 m 个元素表示应合并的元素,后 n 个元素为 0 ,应忽略。nums2 的长度为 n。原创 2023-09-25 21:44:42 · 192 阅读 · 0 评论 -
模式匹配算法
BF#include<iostream>#define MAXA 700using namespace std;typedef struct { char ch[MAXA]; int length;} str;int bf(str s,str p);int main(void) { //模式串初始化 str s; s.length=8; s.ch[0]='a'; s.ch[1]='b'; s.ch[2]='a'; s.ch[3]='a'; s.ch[4]='b原创 2021-07-08 21:27:06 · 138 阅读 · 0 评论 -
快速排序
算法思想:主要是分治算法步骤概括:1.对于一个待排序序列,任意从中选择一个数,一般实现的时候会选择序列的第一个数,这个数被称为基准数。2.将所有小于等于基准数的数放到基准数右边,所有大于基准数的数放到其右边,这样就将基准数以外的数分成了两个子序列。3.对上述两个子序列重复上述步骤,这样序列会被越分越小,最后排序会完成。另外,也可以这么理解,基准数就是当前要将其放到正确排序位置的数,而为了将其放到一个正确的位置,有一个函数处理序列将且只能将序列中的一个数放到正确的位置,那么只要对未排序完成原创 2021-02-03 21:22:42 · 117 阅读 · 0 评论 -
KMP 病毒感染检测
模拟基因序列in.peopleATGCUGACTUGCATUCTUGCUGACCTUGCATUUUGCATUCTUGUGCATUCTUGUGCATUCTUGUGCUGACCTUGCATUGACTUGCATUCTUGCUGACCCATUGACTUGCATUUGACCTUGCATUUUACCCATUGACTUCUGACCCATUGACUGACCCCCATUCTUGCUGACCCATUGACUGCUGACCTUGCATUUCATUCTUGCUGACUGACCTUGCACTUGCATUCTUGACCT原创 2021-02-01 20:38:50 · 1251 阅读 · 0 评论 -
先序遍历和先根遍历的区别
没区别如此,中序和后序原创 2021-02-01 12:24:36 · 4244 阅读 · 2 评论 -
0-1背包问题
动态规划动态规划解决0-1背包问题首先要找到状态,以及状态转换函数。if(j<w[i-1])dp[i][j]=dp[i-1][j];//当j容量小于第i件物品(序号为i-1)重量时,那么装不进i,最大价值不变else dp[i][j]=max(dp[i-1][j],dp[i-1][j-w[i-1]]+v[i-1]);//反之,比较装i和不装i的价值,取最大值开数组,本题中,开dp数组,记录前i件物品,j容量时的最大价值。然后写入初始条件,循环计算dp数组。然后根据每一次的决策,原创 2021-01-31 21:49:28 · 111 阅读 · 0 评论 -
最大子段和问题
最大子段和问题蛮力法、分治法#include<iostream>#include<limits>#include<algorithm> using namespace std;int force(int num[],int n); int dcm(int num[],int left,int right); int main(void){ cout<<"请输入整数n,表示将输入n个数的序列"; int n; cin>&g原创 2021-01-31 21:37:42 · 138 阅读 · 0 评论 -
最小生成树(Kruskal和Prim算法)
转载请注明出处:勿在浮沙筑高台http://blog.csdn.net/luoshixian099/article/details/51908175关于图的几个概念定义:连通图:在无向图中,若任意两个顶点vi与vj都有路径相通,则称该无向图为连通图。强连通图:在有向图中,若任意两个顶点vi与vj都有路径相通,则称该有向图为强连通图。连通网:在连通图中,若图的边具有一定的意义,每一条边都对应着一个数,称为权;权代表着连接连个顶点的代价,称这种连通图叫做连通网。生成树:一个连通图的生成转载 2020-11-21 15:35:21 · 1245 阅读 · 0 评论 -
贪心练习
392. 判断子序列原创 2020-11-21 12:40:36 · 78 阅读 · 0 评论 -
二分查找·练习
704. 二分查找34. 在排序数组中查找元素的第一个和最后一个位置69. x 的平方根原创 2020-11-08 19:35:39 · 140 阅读 · 0 评论