自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(128)
  • 收藏
  • 关注

原创 LeetCode 399 除法求值

(给的三个测试用例过了,但是提交出了问题)问题如下,例如已知[a,b][c,e][b,c],按照上述代码的思路,dp中的路径更新顺序为(1)dp[a][b],dp[b][a](2)dp[c][e],dp[e][c](3)dp[b][c],dp[c][b],dp[a][c],dp[c][a],这样的更新顺序缺失了 dp[a][e],dp[e][a]的可能。1、构建letter map[string]int,dp [][]float64,res []float64。LeetCode热题100完结撒花🎉。

2022-10-27 17:16:55 300

原创 LeetCode 312 戳气球

首先想到的是用回溯的方法暴力求解,遍历所有可能的情况。感觉大概率会超出时间限制。维护全局变量 res 存储当前遍历到的硬币数量的最大值。1)递归函数参数:当前可戳的气球 balloon,已有的硬币数量 icons(初始化为0)2)递归函数内容:(1)如果 balloon 为空,对比当前 icons 与 res,将res更新为最大值(2)如果 balloon 不为空,遍历各个气球,戳破遍历到的气球,更新icons,调用递归函数。实现代码如下,感觉必然会超出时间限制。

2022-10-25 10:47:25 276

原创 随便记记,一些tensor / numpy / pandas的操作【遇到新的了随缘更新】

2、ndarray多个维度同时插入,元素添加操作,用在计算预测结果的时候(这个真的,我为难了好久,结果发现可以直接插入,哭😭)(参考。我是用在测试的时候,使用预测结果与全部特征嵌入进行计算时,将目标特征嵌入扩充维度并复制batch_size 份(参考。1、tensor复制扩充(扩充维度+复制),例如从[1]变成 [[1], [1], [1] ...]

2022-10-25 08:58:14 493

原创 LeetCode 309 最佳买股票时机含冷冻期

1、对题目进行分析,不难发现每一天用户可以选择的操作包括以下几种情况,且有如下限制:1)买入:(第一次购买股票)||(之前购买的股票全部卖出 && 已经度过冷冻期)2)卖出:(有买入的股票)3)冷冻期:(前一天卖出了股票)4)既不买入也不卖出设想可否通过回溯的算法实现对所有可能情况的全遍历。函数的参数包括:

2022-10-24 10:25:37 111

原创 LeetCode 301 删除无效的括号

同样用上述例子在脑子里跑了一遍代码后发现并不会出现错误,因为i=1的情况下存在合法字符,且队列的数据结构会保证先遍历完i=1的情况再遍历i=2的情况,那么再遍历i=2的情况前 flag一定会被设置为true(这保证了不会有i=3的情况加入到队列)。考虑到括号都是成对出现,如果i=1的情况下字符串合法,那么i=2的情况下不可能会存在合法字符串,加入到队列中的i=2的情况肯定不会被加入到res中,保证了最后结果的正确性。2)当s在删除 i 个括号的某一情况下合法时,将该情况下删除括号后的s加入res中。

2022-10-20 10:44:51 112

原创 LeetCode 297 二叉树的序列化与反序列化(关于字符串的一些操作,要重新做,第一次做得不太顺)

1、看到题目首先想到的是什么是序列化,什么是反序列化,题目说得好抽象😥,后来才发现为了方便存储,序列化就是要将原本的数据结构存储为字符串,反序列化即将该字符串重新变回之前的数据结构。题目所给的数据结构为二叉树,所以这道题目的目标在于将二叉树存储为字符串,再将字符串转为二叉树。注:注意一些字符串与int之间的相互转化。

2022-10-18 10:02:15 84

原创 LeetCode 239 滑动窗口最大值(Go的接口)

注意:为了降低代码的复杂程度,在窗口左边界移动时并不需要每次左移都将对应位置的元素移除(这个操作相对复杂),当且仅当遇到情况2)时,即应该被移除的元素是堆顶,弹出堆顶元素(此时是直接弹出堆顶元素,相比于删除堆中元素操作难度降低),直至新的堆顶在窗口范围内。结合堆之后,这道题目就将滑动的窗口以大根堆(树节点为堆中的最大值)的结构进行存储,每次窗口右移就将新的元素加入堆中。面对这两种情况,如果新移入的值大于上一窗口的最大值,那么该值必为当前窗口的最大值,否则如果是情况1),当前窗口最大值仍为上一窗口最大值;

2022-10-17 11:02:54 395

原创 LeetCode 208 实现Trie(前缀树)

1、看完题目感觉想要简单的实现还是很容易的,直接将每次插入的word当作字符串类型存储起来,查找字符串的时候将待查找字符串与存储的各个字符串依次用“==”比较,查找前缀的时候,对存储的各个字符串用strings.HasPrefix库函数查找前缀是否存在。方法十分暴力,但居然通过了,只是执行用时,内存消耗都不太好😭。还试了一下用不同的初始化方法,但最终的运行评价来看还是在struct中直接初始化的耗时短一点,用make在Constructor进行初始化的代码如下。

2022-10-14 10:39:31 98

原创 LeetCode 207 课程表(可试着补个DFS的解法)

之后遍历queue,针对队列队首的节点i,遍历图中该节点指向的节点graph[i],对应节点的入度值--(所需的先修节点--),如果节点入度值减为0,说明当前节点前面所需的节点均已在拓扑中,将其加入队列中。维护以下数据结构:graph [][]int(存储有向图信息)inDegree []int(记录各个节点的入度)queue []int(队列,存储当前入度为0的节点,节点前面所需的节点均已在拓扑中)过程:根据 prerequisites,在graph[i]中存储节点i所指向的节点。

2022-10-13 11:43:40 75

原创 LeetCode 124 二叉树中最大路径和

使用二叉树伴侣递归算法,递归的内容实质上就是每一节点对应左右子树的最大路径和。我们比较容易可以知道,最大路径和为7->11->4->13,当程序运行至递归终点节点7时,为叶子节点,其左子树和右子树的最大路径和均为0,返回当前节点值7,之后回溯到节点11,此时的最大路径和为7+11+2=20,之后继续回溯到节点4,此时的最大路径和为max(11+7, 11+2)+4+max(13, 0)结果为35,此时递归到根节点,返回最终结果为35。

2022-10-10 09:50:04 90

原创 LeetCode 85 最大矩形

参见 LeetCode 打卡 Day 54 —— 柱状图中最大的矩形 中使用栈的解法,还是挺复杂的,构建一个栈,保证栈中存储的各个下标i,满足height[i]递增,当遍历到j,而height[j]

2022-10-07 09:50:24 172

原创 LeetCode 10 正则表达式匹配

100道题里的中等和简单级别的题基本都做完了,现在困难级别的来了。果然困难题目难就难在这个分情况分类讨论了,真是分类分类,越分越“累”。那就来想各种可能的结果吧。3、当p[1]==‘*’ —> 循环,每一次循环都对s[0:]和p[2:]或者在满足s[0]==p[0] || p[0]=='.'条件的情况下,令s[1:]和p进行匹配,二者有任一匹配,返回true,否则返回 false。='*',且s[0]==p[0] || p[0]=='.' —> 对p[1:]和s[1:]进行匹配,否则返回 false。

2022-10-05 09:33:40 72

原创 LeetCode 739 每日温度

看完题目后感觉最直观的暴力解法还是比较容易想到的,就是遍历数组,对于当前温度 temperatures[i],遍历之后各天的温度,找到第一个温度高于 temperatures[i] 的 temperatures[j],将 j 存储于answer[i] 中。本来以为会超出时间限制,没想到居然通过了,实现的代码如下。想一些可以优化的方法,看了答案之后发现可以使用递减栈完成,即维护一个数字大小递减的栈(注意:栈中存储的不是数字,而是对应数字在数组中的下标)。我们对数组进行遍历。

2022-10-04 09:13:37 185

原创 LeetCode 647 回文子串

1、看到子串,首先就会想到动态规划,对于回文子串,存在如下规律,当s[i]==s[j],同时s[i+1]到s[j-1]之间的字符串满足回文子串,那么s[i]到s[j]之间就同样是回文子串。从s[0]开始,当 j==3 时,明显s[0:3]为回文子串,根据上述的判断条件需要满足 s[0]==s[3] && (3-0==1 || dp[1][2]==true),但是因为还没有对i==1的情况进行遍历,所以此时dp[1][2]==false,不满足条件,s[0:3]无法被正确判断,造成错误。

2022-10-03 11:13:47 96

原创 LeetCode 621 任务调度器

分别维护一个哈希表mp以及列表s,二者存储内容如下:mp中存储各个任务对应的待完成任务数,每完成一个任务,对应的待完成任务数--。s中存储任务的类型,当该任务的待完成任务数为0时,从s中删除该任务。看到题目的时候,第一个反应是动态规划,回溯好像都不太适用。所以思考自己的解法。

2022-10-02 11:03:10 116

原创 GO七天开发挑战:7天实现Web框架-Gee(day 4 分组控制Group)

这里的分组是指对可以进行相似处理的路由进行分组,是否分为一个组通常是以前缀进行区分,例如 /admin 为一个分组,那么 /admin/a 和 /admin/b 就是该分组下的子分组。如果没有分组控制,那么就需要对这两个不同的路由分别进行控制,会增加不必要的工作,也会增加路由控制的难度和复杂度。此外,分组支持嵌套,父分组的功能应该可以作用到子分组上,例如 /admin分组应该包含顶层分组 / 的相关处理。分组需要通过前缀来对分组进行区分,所以包含 string 类型的 prefix;

2022-09-30 14:58:12 786 1

原创 LeetCode 581 最短无序连续子数组

1、看到题目首先想了一下动态规划,但觉得没有办法实现,其它可能的算法也较难实现。结果发现其实没有思路的时候也可以先用暴力算法解决,之后在暴力的基础上想可以如何进行改进。(2)从尾遍历的end,记录已遍历的降序数组,保证 end>start,如果出现什序的情况或者end对应的值小于start,那么对应的end位置就是所求子数组的尾(此时子数组的头为 start 对应)。(1)从头遍历的start,记录已遍历的升序数组位置,如果出现降序的请款,那么对应的start位置就是所求子数组的头。

2022-09-30 09:54:05 76

原创 LeetCode 560 和为K的子数组

看到题目的时候首先想到的是动态规划(以为暴力遍历过不了OJ,谁知道看答案发现居然能过🤦‍♀️),因为要找的是连续的子数组,所以省去了很多可能的情况,思考动态规划的状态转移方程。那么对于在当前 i 位置是否存在满足条件的子数组,可以通过判断之前有几个位置 j 满足 dp[i]-dp[j]==k(dp[j]==dp[i]-k) 来判断。然后就发现好像不是那么需要动态规划了,看来不是所有的子数组都要动态,只要用一个哈希表 mp 来存储 dp[j] 的情况即可。

2022-09-29 09:58:00 76

原创 GO七天开发挑战:7天实现Web框架-Gee(day 3 前缀树路由Router)

其中,roots 是请求的路由对应的树根节点,用于判断路由是否匹配,起始的树节点为 GET/POST等请求类型节点(key eg, roots['GET'] roots['POST']);否则查找子树中所有可以匹配的节点,遍历这些节点,递归查找下一层是否匹配,直至找到完全匹配路由的叶子节点,并将该叶子节点返回。(2) 查找子树中所有可能的匹配:遍历当前节点对象的所有子节点,将所有可匹配的节点放入 slice 中,遍历所有节点后,返回 slice。根据请求的类型以及路由找到匹配的节点后,返回对应的响应内容。

2022-09-25 11:57:21 916

原创 LeetCode 538 把二叉搜索树转换为累加树

在构建后续遍历的过程中遇到了不小的问题,主要在于如何将值进行传递,最后通过 (1)sum 参数:传递搜索树中所有大于当前节点的键值和。关于累加树:二叉搜索树具有如下的特征,左子树的键值小于根节点,右子树的键值大于根节点。累加树即针对当前节点,计算当前节点键值+比该节点的键值大的节点键值之和。例如:树中的节点6,根据二叉搜索树的特点不难发现,比它大的节点分别是7和8,将这三个节点的值累加,就得到了节点6对应的累加树的值 6+7+8=21.

2022-09-25 10:47:37 63

原创 LeetCode 494 目标和

递归结束:当遍历到数组最后一个位置时,判断此时的表达式和是否为target,若是res++,否则res不变。1、递归(感觉递归就是一个变相的暴力遍历,想要降低复杂度需要合理的剪枝操作)递归体:之前的表达式和,分别+/-当前位置的数字,然后递归到下一个位置。递归参数:遍历到的数组位置,之前的表达式和。2、优化算法,降低时间复杂度。

2022-09-23 08:48:19 44

原创 LeetCode 438 找到字符串中所有字母异位词

比较ms与mp是否相同,之后对s中后面的字符采用如下操作,ms[s[i]]++,ms[s[i-len(p)]]--,比较修改后的ms与mp是否相同,相同,将 i 加入返回值列表。然后对s的每个字符进行遍历,计算以s[i]为起点,长为len(p)的子串中的各个字符数,对比与p是否相同,相同则将i加入到返回列表,否则break遍历s中的下一个字符。1)编写代码错误,在ms中存储了p中字符的统计情况,导致无论如何都会将0添加到返回结果中报错。滑动窗口的思想不要忘!

2022-09-22 09:10:31 142

原创 LeetCode 437 路径总和 |||(需要考虑优化)

例如,对于题目途中10的节点,长为3的路径包含以下几种情况 [10,5,3][10,5,2][10,-3,11],这其中包含了节点5,-3对应的长为2的路径。(2)否:遍历fathers,对应的路径和依次相加,判断结果是否==targetSum,是的话res++(2)当前根节点的父节点到当前节点的路径和:fathers map[*TreeNode]int 类型。暴力穷举:从每一个节点出发,计算当前节点到各个子树节点所有路径,按照路径长度进行遍历。1)维护如下公共变量:res(int)记录满足条件的路径数。

2022-09-16 10:08:10 65

原创 LeetCode 416 分割等和子集

全部元素相加得到和,如果为奇数,必然无法满足调节,如果为偶数,那么目标子集和已经确定(全部元素和的一半),只要令一个子集的和满足目标,那么可以直接返回 true。所以原题就可以转变为计算nums中的数字能否组成 targetNum。对于这种问题,首先可以遍历全部的子集和,但可能会造成较大的时间复杂度,出现超出运行时间的错误。

2022-09-15 10:43:03 53

原创 LeetCode 406 根据身高重建队列

懵住了,明天再试着做一下。

2022-09-14 11:04:34 83

原创 LeetCode 394 字符串解码

2、看到题目中包含括号的第一瞬间,想到可以使用栈的数据结构,将左括号以及中间的字符串入栈,直至遍历到右括号,将括号间的字符按规定次数进行重复后加入到结果字符串中。注意:go中遍历,要先判断t>=0,随后才可以进行stack[t]=="xxx"的判断,否则会因为可能产生stack[-1]的情况而编译报错。rune:rune 类型可以直接通过 int()函数转为整型数字,[]rune类型可以直接通过string()函数转为string类型。同时对go中字符相关的rune类型进行学习。

2022-09-13 08:31:15 53

原创 LeetCode 347 前K个高频元素

2、首先对nums数组进行遍历,在frequency中对各个数字的频率进行统计。之后对frequency进行遍历,将出现频率为 i 的数字 n 存入数组,bucket[i].append(n)。最后由后向前遍历 bucket ,取后面k个数值即题目所求的前K个高频数字。

2022-09-12 08:39:37 141

原创 LeetCode 337 打家劫舍 3

其实一看到二叉树就想到了回溯,但是我的问题在于每次都想要先把回溯(动态规划也有这种情况)的各个细节想清楚,然后再理清思路开始编写代码,思路很容易绕进去就乱了。但感觉回溯其实可以把递归函数的返回值当作已知值,思考如何在这个值已知的情况下,分类讨论各个情况(主要还是把问题所有可能的情况进行分类讨论)注意:以上方法提交时,结果正确,但超出要求的时间范围,考虑到递归过程中存在大量的重复计算,所以采用空间换时间的策略,维护哈希表money[*TreeNode]int,存储以各个节点为根时抢到的最多钱。

2022-09-10 09:41:19 88

原创 LeetCode 322 零钱兑换(缺递归方法)

注意:在dp数组的初始化中,不必使用 INT_MAX 进行初始化,因为存在dp[i]+1的计算,可能会发生溢出,考虑到硬币的最小面值为1,所以最多需要的硬币数为amount,而amount+1则是无法达到的硬币数,因此使用 amount+1 代替 INT_MAX进行初始化。对于每一个i,遍历所有的硬币,当硬币面额小于i时,可以使用当前硬币,通过如下状态转移方程,确定dp[i]的值。dp[i] = min(dp[i], dp[i-coin[j]]+1) 注:coin[j]表示当前硬币面额大小。

2022-09-09 09:06:14 76

原创 LeetCode 300 最长递增子序列

1、数据结构:一维数组 dp 存储动态规划过程中的子状态。

2022-09-08 08:43:40 52

原创 LeetCode 279 完全平方数

根据以上内容,首先将所有4的倍数均除以4简化(必须在第一步,否则除8余7会出现问题)。构建 dp 数组(所有值初始化为INT_MAX),从1~n遍历(因为n为正整数,所以其值至少为1),j从1开始遍历到 i+j*j。一个数如果含有因子4,那么我们可以把4都去掉,并不影响结果(2)如果一个数除以8余7的话,那么肯定是由4个完全平方数组成。根据定理可知返回结果只能在1,2,3,4中,同时根据定理还可推导出以下结论(自己不会推,看的答案😭)(1)1、数据结构:四平方和定理中仅需要一个整型结构。

2022-09-07 08:51:49 49

原创 LeetCode 287 寻找重复数

计算[1,n]的中位数mid,对nums遍历,计算mid,证明重复的数字在[1,mid]范围中,否则在[mid+1,n]范围中。2、折半查找:首先想到的思路就是从1~n进行遍历,计数nums中对应数的个数,若某个数的计数结果>=2,那么该数就是需要返回的重复数字,编写完成代码运行时报超时的错误,发现题目的时间复杂度不允许>=O(n^2)。要降低时间复杂度,就要对遍历过程进行优化,原本是从1~n的遍历,将其修改为折半查找,对应的代码思路修改如下。

2022-09-06 09:12:28 45

原创 LeetCode 240. 搜索二维矩阵 II

2、递归:注意到,当矩阵某一行 j 满足 line[i-1]target,那么 line[i] 的右下角的所有数字均大于 target,line[i] 的左上角的所有数字均小于 target。即遍历数组,找到满足上述描述的位置,递归遍历该点的左下角。易错点注意:递归时传递的参数为行和列,根据我的代码逻辑,应该是起始的行和结束的列。

2022-09-04 11:17:10 51

原创 LeetCode 238. 除自身以外数组的乘积

优化:对空间复杂度进行优化,因为ans本身数据结构与pre和sub一致,所以直接用ans代替pre,在第二次遍历nums的过程中,维护整型结构sub(初值为1),保存位置i对应后缀的乘积(实现见Java版的代码)2、双指针:对 nums 进行遍历,在遍历的过程完成对 pre 和 sub 的填写。之后对 pre 和 sub 进行遍历,在对应的位置上相乘,得到最终的answer。1、数据结构:一维数组 pre 和 sub 分别存放 nums[i] 对应 i 的前缀和后缀的乘积。

2022-09-03 17:34:31 97

原创 LeetCode 236 二叉树最近公共祖先

1)当left或者right既不为null,也不是p或者q中的任意一个,那么仅有一种情况,当前的这个left或者right就是所求的最近公共祖先,可以停止相关的遍历,直接返回。2)由于递归返回的情况仅有以下几种(p和q,p和nil,q和nil,最近公共祖先和nil,所以当检测到left,right不为空时,直接返回当前节点即可。2、递归:递归遍历树,当节点为null时返回null,当节点为目标节点p,q 时,返回对应的p,q。情况(1):left,right 分别返回 p,q 节点,则返回当前节点。

2022-09-02 10:09:07 157

原创 LeetCode 221 最大正方形

1. 没有意识到,最大面积正方形应该由 ‘1’ 填充,仅遍历长宽会导致如下问题,长宽对应的两条边由 '1' 组成,但正方形内部缺存在 ‘0’,这时这个正方形不满足条件。2、 深度优先搜索 DFS:每当访问到1时,以此点为左上角分别对长和宽开始搜索,计数得到的两个数字取其中较小的为正方形的边长,平方运算后即正方形的面积。解决:想到了递归,大正方形必然套在小正方形外一层,每个小正方形,若外围均为 ‘1’ 或者为边界,那么就可以构成更大的正方形。若是,存在长度为n的正方形,否则不存在。...

2022-09-01 10:41:49 140

原创 LeetCode 215 数组中的第K个最大元素

2、计数排序(假设给定待排序数组为 nums [2,3,4,7,8,1,2,9],获取第k的值)注意点:题目所给num[i]的范围包含负数部分,无法直接用pos的下标i来表示值。在第一次遍历nums的过程中,除最大值外同时记录最小值。桶pos的大小设置为 max-min+2。最后的返回结果为对应下标 i + min。在pos[v-min]处记录v的个数。1、数据结构:一维数组(桶 pos)...

2022-08-31 08:57:14 60

原创 152. 乘积最大子数组

代码】152. 乘积最大子数组。

2022-08-10 18:29:38 60

原创 LeetCode 打卡 Day 63 —— 448. 找到所有数组中消失的数字

发现 [1, n] 范围内的数字与数组下标存在对应关系,所以假设数组nums存在数字num,那么对nums[num-1]进行+n操作,在后续遍历数组遇到nums[num-1]数据时,进行%操作即可得到原有的数据。首先想到的是较为简单的解法,构建哈希表,将“存在”的数字存入哈希表中,之后遍历所有在 [1, n] 范围内的数字,查找数字是否在哈希表中,若不在表中,则该数字为“消失”的数字,实现代码如下。遍历整个数组,若数组下标为num的值...

2022-08-06 12:19:34 165

原创 LeetCode 打卡 Day 62 —— 338. 比特位计数

使用了最为基础的解法,通过对数字进行取余和除法运算将数字转换为了二进制形式,统计其中1的个数(取余结果相加即可),例如对于数字num=7,假设计数结果为 ans(初值为0),计数过程如下。得到比特1的个数为3。...

2022-08-06 12:15:59 1522

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除