hlc@
码龄1年
关注
提问 私信
  • 博客:122,680
    问答:41
    122,721
    总访问量
  • 236
    原创
  • 9,067
    排名
  • 1,615
    粉丝
  • 0
    铁粉
  • 学习成就
IP属地以运营商信息为准,境内显示到省(区、市),境外显示到国家(地区)
IP 属地:陕西省
  • 加入CSDN时间: 2023-09-15
博客简介:

sjsjs11的博客

查看详细资料
  • 原力等级
    成就
    当前等级
    5
    当前总分
    1,208
    当月
    250
个人成就
  • 获得2,140次点赞
  • 内容获得6次评论
  • 获得1,271次收藏
  • 代码片获得119次分享
创作历程
  • 236篇
    2024年
成就勋章
  • 入选《数据结构与算法领域内容榜》第37名
TA的专栏
  • 动态规划
    89篇
  • 精选
    79篇
  • 数据结构
    94篇
  • c#
    1篇
  • 贪心算法
    13篇
  • 待完善
    4篇
  • Unity
    6篇
  • 图形学
    20篇
兴趣领域 设置
  • 编程语言
    c++c#typescript
  • 数据结构与算法
    算法数据结构
  • 游戏
    cocos2dunity图形渲染
创作活动更多

如何做好一份技术文档?

无论你是技术大神还是初涉此领域的新手,都欢迎分享你的宝贵经验、独到见解与创新方法,为技术传播之路点亮明灯!

178人参与 去创作
  • 最近
  • 文章
  • 代码仓
  • 资源
  • 问答
  • 帖子
  • 视频
  • 课程
  • 关注/订阅/互动
  • 收藏
搜TA的内容
搜索 取消

【划分型DP】力扣2008. 出租车的最大盈利

乘客信息用一个下标从 0 开始的二维数组 rides 表示,其中 rides[i] = [starti, endi, tipi] 表示第 i 位乘客需要从地点 starti 前往 endi ,愿意支付 tipi 元的小费。输入:n = 20, rides = [[1,6,1],[3,10,2],[10,12,3],[11,12,2],[12,15,2],[13,18,1]],其中 m 是 rides 的长度,n 是地点数目。输入:n = 5, rides = [[2,5,4],[1,5,1]]
原创
发布博客 17 小时前 ·
302 阅读 ·
3 点赞 ·
0 评论 ·
5 收藏

【划分型DP】力扣2830. 销售利润最大化

我们可以以某个offer的end为索引储存到数组group中,储存的是start和gold数据,也就是offer[0]和offer[2]。将位于 [0,0] 范围内的房屋以 1 金币的价格出售给第 1 位买家,并将位于 [1,3] 范围内的房屋以 2 金币的价格出售给第 3 位买家。输入:n = 5, offers = [[0,0,1],[0,2,10],[1,3,2]]输入:n = 5, offers = [[0,0,1],[0,2,2],[1,3,2]]返回你可以赚取的金币的最大数目。
原创
发布博客 18 小时前 ·
239 阅读 ·
0 点赞 ·
0 评论 ·
1 收藏

【数据结构-队列】力扣2810. 故障键盘

我们可以发现,反转可以看作改变添加字符的方向,所以我们定义一个双端队列que和一个用来判断方向的k,一旦遇到i就令k取反,然后来判断要从前面加入元素还是后面加入元素,最后根据k的方向来从前往后或者从后往前来输出双端队列的字符,储存在res中。,其中 n 是字符串 s 的长度。,即为双端队列需要使用的空间。
原创
发布博客 前天 22:08 ·
189 阅读 ·
1 点赞 ·
0 评论 ·
0 收藏

【数据结构-队列】力扣1670. 设计前中后队列

从 [1, 2, 3, 4, 5, 6] 的中间位置弹出元素,返回 3 ,数组变为 [1, 2, 4, 5, 6]。int popMiddle() 将 正中间 的元素从队列中删除并返回值,如果删除之前队列为空,那么返回 -1。将 6 添加到 [1, 2, 3, 4, 5] 的中间位置,结果数组为 [1, 2, 6, 3, 4, 5]。int popFront() 将 最前面 的元素从队列中删除并返回值,如果删除之前队列为空,那么返回 -1。// 返回 1 -> [4, 3, 2]
原创
发布博客 前天 20:54 ·
169 阅读 ·
4 点赞 ·
0 评论 ·
5 收藏

【数据结构-队列】力扣641. 设计循环双端队列

需要注意的是,在题解中,rear指向的是插入的位置,而front指向的是队列头元素的位置,所以在插入队头元素的时候要先移动front再插入,而插入队尾元素的时候先插入再移动rear。如果操作成功返回 true ,否则返回 false。boolean isEmpty() :若双端队列为空,则返回 true ,否则返回 false。boolean isFull() :若双端队列满了,则返回 true ,否则返回 false。int getFront() ):从双端队列头部获得一个元素。
原创
发布博客 前天 19:01 ·
843 阅读 ·
16 点赞 ·
0 评论 ·
6 收藏

【数据结构-队列】力扣622. 设计循环队列

在一个普通队列里,一旦一个队列满了,我们就不能插入下一个元素,即使在队列前面仍有空间。// 返回 false,队列已满。enQueue(value): 向循环队列插入一个元素。// 返回 true。// 返回 true。// 返回 true。// 返回 true。// 返回 true。MyCircularQueue(k): 构造器,设置队列长度为 k。deQueue(): 从循环队列中删除一个元素。// 返回 true。如果队列为空,返回 -1。
原创
发布博客 前天 02:15 ·
675 阅读 ·
15 点赞 ·
0 评论 ·
7 收藏

【数据结构-队列】力扣232. 用栈实现队列

而在这一题栈模拟队列中,如果使用那种做法会发现我们没办法将栈元素的排列顺序和队列类似,所以我们就只需要按栈的顺序来排列元素,然后我们在pop的时候,将栈底的元素弹出就行。那么要将栈底的元素弹出,我们就需要另外一个栈st2来辅助,我们将栈st1的元素全部推入st2中,然后st1的栈底元素就在st2的栈顶,将st2栈顶的元素pop并返回后,再将st2的元素推入st1中,这时候就可以实现st1栈底元素被pop掉。假设所有操作都是有效的 (例如,一个空的队列不会调用 pop 或者 peek 操作)
原创
发布博客 2024.11.23 ·
440 阅读 ·
3 点赞 ·
0 评论 ·
10 收藏

【数据结构-队列】力扣225. 用队列实现栈

栈是后进先出,队列是先进先出,所以我们需要做的就是将最后进入的元素能够放在队列的前面,由于队列是从后面推入元素,所以我们就将要推入的元素先放到队列q2中,然后再将q1的元素推入到q2,这时候要推入的元素就在队列的最前面,如果pop的话就会先pop出最后进入的元素。然后我们swap队列q1和q2,这样才能够不断循环,以队列q1为主要模拟栈,队列q2是用来辅助的。请你仅使用两个队列实现一个后入先出(LIFO)的栈,并支持普通栈的全部四种操作(push、top、pop 和 empty)。// 返回 False。
原创
发布博客 2024.11.23 ·
288 阅读 ·
6 点赞 ·
0 评论 ·
2 收藏

【数据结构-队列】力扣950. 按递增顺序显示卡牌

我们得到的牌组顺序为 [17,13,11,2,3,5,7](这个顺序不重要),然后将其重新排序。我们得到的牌组顺序为 [17,13,11,2,3,5,7](这个顺序不重要),然后将其重新排序。重新排序后,牌组以 [2,13,3,11,5,17,7] 开始,其中 2 位于牌组的顶部。重新排序后,牌组以 [2,13,3,11,5,17,7] 开始,其中 2 位于牌组的顶部。牌组现在是 [3,11,5,17,7,13]。牌组现在是 [3,11,5,17,7,13]。牌组现在是 [5,17,7,13,11]。
原创
发布博客 2024.11.22 ·
372 阅读 ·
3 点赞 ·
0 评论 ·
10 收藏

【数据结构-队列】力扣933. 最近的请求次数

确切地说,返回在 [t-3000, t] 内发生的请求数。// requests = [1, 100, 3001, 3002],范围是 [2,3002],返回 3。可以使用队列的方法,每次ping首先先记录当前请求到队列中,然后由于t是逐渐增大的,所以我们只需要将小于t-3000的t给弹出,然后返回队列q的大小即可。// requests = [1, 100, 3001],范围是 [1,3001],返回 3。// requests = [1],范围是 [-2999,1],返回 1。
原创
发布博客 2024.11.21 ·
279 阅读 ·
1 点赞 ·
0 评论 ·
2 收藏

【数据结构-表达式解析】力扣227. 基本计算器 II

那么当我们遍历3的时候,会被储存在num中,当遇到加号的时候,就会将num给push到栈中,然后将preSign更新为加号,然后遍历到5,记录到num中,然后空格跳过,接下来遇到除号,我们这时候不进行除号运算,而是进行前面preSign的运算,preSign是加号,也就是继续将5推入栈中,运算完后将preSign更新为除号,然后遍历2,记录num=2,这时候经过while循环的i++,此时i=n,触发了if判断,此时preSign为除号,将栈顶的5除以当前的num值2。输入:s = " 3/2 "
原创
发布博客 2024.11.20 ·
513 阅读 ·
4 点赞 ·
0 评论 ·
4 收藏

【数据结构-表达式解析】【hard】力扣224. 基本计算器

所以我们可以构建一个栈st来储存符号,我们初始化符号sign(1或-1)为1,当我们遍历字符串的时候,遇到左括号,就往栈中推入sign,推入的sign会位于栈顶,作用于这个左括号开始到右括号结束之间的符号,假设我们这时候sign是-1,然后遇到了一个左括号,然后接着在这个括号范围内遇到了一个减号,那么他就将sign变为1,也就是我们所说的负负得正,接着当我们遇到右括号的时候,就弹出栈顶的sign,因为栈顶的sign只作用于这个括号范围。输入:s = “(1+(4+5+2)-3)+(6+8)”
原创
发布博客 2024.11.20 ·
393 阅读 ·
7 点赞 ·
0 评论 ·
2 收藏

【数据结构-表达式解析】力扣1006. 笨阶乘

例如,clumsy(10) = 10 * 9 / 8 + 7 - 6 * 5 / 4 + 3 - 2 * 1。例如,factorial(10) = 10 * 9 * 8 * 7 * 6 * 5 * 4 * 3 * 2 * 1。相反,我们设计了一个笨阶乘 clumsy:在整数的递减序列中,我们以一个固定顺序的操作符序列来依次替换原有的乘法操作符:乘法(*),除法(/),加法(+)和减法(-)。这保证结果是一个整数。解释:12 = 10 * 9 / 8 + 7 - 6 * 5 / 4 + 3 - 2 * 1。
原创
发布博客 2024.11.20 ·
228 阅读 ·
2 点赞 ·
0 评论 ·
4 收藏

【数据结构-表达式解析】力扣150. 逆波兰表达式求值

输入:tokens = [“10”,“6”,“9”,“3”,“+”,“-11”,“该算式的逆波兰表达式写法为 ( ( 1 2 + ) ( 3 4 + ) * )。解释:该算式转化为常见的中缀算术表达式为:(4 + (13 / 5)) = 6。解释:该算式转化为常见的中缀算术表达式为:((2 + 1) * 3) = 9。输入:tokens = [“4”,“13”,“5”,“/”,“+”]输入:tokens = [“2”,“1”,“+”,“3”,“*”]用栈可以完美模拟逆波兰表达式,过程较简单,不多解释。
原创
发布博客 2024.11.19 ·
235 阅读 ·
5 点赞 ·
0 评论 ·
5 收藏

【划分型 DP-约束划分个数】【hard】【阿里笔试】力扣1278. 分割回文串 III

想象我们有一个指针m,他的作用是在m处作为状态转移的位置,于是我们可以由f[m][j-1]也就是从m-1下标开始及之前分割成j-1个回文串需要的最少修改字符数,然后加上cost[m][i-1]也就是f[i][j]。然后我们定义一个二维数组f[i][j],用 f[i][j] 表示对于字符串 S 的前 i 个字符,将它分割成 j 个非空且不相交的回文串,最少需要修改的字符数。我们遍历数组,然后内层循环j,当j=1的时候,说明不分割,所以f[i][1] = cost[0][i-1]。s 中只含有小写英文字母。
原创
发布博客 2024.11.19 ·
770 阅读 ·
16 点赞 ·
0 评论 ·
6 收藏

【划分型DP-约束划分个数】力扣813. 最大平均值和的分组

因为由于我们状态进行了压缩,所以f[x]里面实际上保存的信息是上一轮的数据,如果我们i使用正序去遍历,那么f[i]就会覆盖掉f[x]的数据,导致在状态转移的过程中,无法读取到上一轮的f[x]的数据。,也就是说,我们枚举i后,从j-1到i-1的范围内枚举x,这样子f[i][j]就可以由f[x][j-1]加上第x个元素到第i个元素的平均值转移而来。nums 的最优分组是[9], [1, 2, 3], [9]. 得到的分数是 9 + (1 + 2 + 3) / 3 + 9 = 20.输出: 20.00000。
原创
发布博客 2024.11.18 ·
455 阅读 ·
4 点赞 ·
0 评论 ·
4 收藏

【划分型DP-约束划分个数】【hard】力扣1745. 分割回文串 IV

我们预处理完字符串后,我们可以观察题目是是否能分割成三个非空回文子字符串,所以我们只需要枚举中间的范围,然后从开头0到i-1就是第一个范围,从j+1到n-1就是第三个范围。给你一个字符串 s ,如果可以将它分割成三个 非空 回文子字符串,那么返回 true ,否则返回 false。首先要做的是预处理,看字符串中哪些范围是回文串,然后我们将它记录到数组f中。解释:“abcbdd” = “a” + “bcb” + “dd”,三个子字符串都是回文的。如果遍历完后还没有返回true,那么就返回false。
原创
发布博客 2024.11.18 ·
790 阅读 ·
22 点赞 ·
0 评论 ·
5 收藏

【划分型DP-约束划分个数】力扣1043. 分隔数组以得到最大和

我们在推到f[i]的时候,我们可以从i开始枚举j,来枚举分割的区间,然后我们可以通过。倒序遍历 j 的过程中可以顺便维护区间最大值,这样 d[i] 的转移可以在 O(k) 的时间内完成。来求出[j,i]的最大和是多少,因为这时候j小于i,所以我们也知道f[j]是多少,这时候我们可以状态转移。输入:arr = [1,4,1,5,7,3,6,1,9,9,3], k = 4。输入:arr = [1,15,7,9,2,5,10], k = 3。解释:数组变为 [15,15,15,9,10,10,10]
原创
发布博客 2024.11.16 ·
219 阅读 ·
4 点赞 ·
0 评论 ·
2 收藏

【划分型DP-约束划分个数】【hard】力扣410. 分割数组的最大值

这道题的目的就是要找出连续子数组的最大值,那么我们可以思考,我们是不是可以假设一个最大值,然后看一下如果要让子数组分割的最大值不超过假定的最大值,那么要分割几次。一旦分割的次数小于等于题目要求的k的话,那么就说明假定的最大值大于等于实际的最大值,那么就让right = mid,这样才可以让接下来假定的最大值变小。给定一个非负整数数组 nums 和一个整数 k ,你需要将这个数组分成 k 个非空的连续子数组,使得这 k 个子数组各自和的最大值 最小。输入:nums = [1,2,3,4,5], k = 2。
原创
发布博客 2024.11.13 ·
354 阅读 ·
4 点赞 ·
0 评论 ·
3 收藏

【划分型DP-最优划分】力扣LCR 165. 解密数字

这道题和将字母翻译为数字的逻辑一样,我们只需要定义dp[i]为前i个字符组成的字符串所能解密的字母个数。然后我们开始遍历i,以第i个字符和第i-1个字符进行讨论,当curNum是0-5之间的时候,并且lastNum是1或2,我们可以将他们两个数字转化为一个字符。解释: 216612 解密后有 6 种不同的形式,分别是 “cbggbc”,“vggbc”,“vggm”,“cbggm”,“cqgbc” 和 “cqgm”如果curNum是其他数字,那么只有当lastNum为1的时候,这两个数字才能转化为一个字母。
原创
发布博客 2024.11.12 ·
286 阅读 ·
4 点赞 ·
0 评论 ·
1 收藏
加载更多