- 博客(27)
- 收藏
- 关注
原创 【leetcode 100】贪心Java版本
i之间的所有位置,看它最远能到哪里,然后看最后能超过n-1,超过了说明能跳到n-1。但是又是很模糊的感觉,不知道具体怎么去“遍历”。注意思路是维护的是一个变量即最远能到达的位置,不是为每个位置都维护,这与上一题不同,上一题记录的是每个字母最远能到的位置。我的思路:第一次没有一点思路,第二次看了官网思路后,写的以下答案,没有搞明白循环遍历,此处贪心的思路是:有多个可以跳到最后一个位置的情况时,也就是对应下标最小的那个。我的思路:加入从0跳到第i个位置,那么0。我写的有问题:超出时间限制(待解决)
2025-04-08 22:23:44
254
原创 力扣hot100【链表】
思路:公式推导(根据链条长度和快的是慢的两倍关系,推导环内长度与环外长度的倍数关系),再找快慢指针先相遇的地方,根据公式长度倍数关系,设置第三个指针,然后第三个指针与慢指针同时遍历,直到相遇的地方就是环的入口。我的思路,双指针,相差N但是卡了bug进行了边界处理,而且多了一个没必要的pre指针,其实不好,不通用,官方的双指针用了虚拟头节点。我的思路:两个链表一长一短,先把长的提前遍历使两个链表的长度相等,然后同时遍历,如果遍历的节点相等时说明相交,否则不相交。官方:没看,三种方法。没思路,直接看的答案。
2025-04-08 22:20:54
662
原创 【leetcode100】动态规划Java版本
又想的是要连续的话,如果后一个和前一个相乘结果变小了,那就段了,从dp[i]从头开始了,先把用nums数组初始化dp,dp[i]表示的就是i前面最大的连续乘积,但是这种方法也不对,比如例子:【-2,3,-4】我的输出就是3,而正确结果是24,错误原因:我相当于把nums整个数组分割成每一个小段了,只比较了的dp[i-1]*nums[i]和dp[i-1],相当于只考虑了前一个数字,没有整个考虑。其他的错误的想法:以为dp[i]=dp[i-1]+1;从第i-1到第i个只有dp[i-1]的方法。
2025-04-04 19:42:24
674
原创 递归类问题(待补充)
5. 注意该问题因为是栈中元素有序,所以可以递归解决6. 该问题数据结构是栈,顺序存储的元素,与单链表不同,单链表递归可能会考虑它的上一个结点。不过递归尽头都是单一的一个元素如何解决。7. 关于问题规模:数组直接传递参数n, 单链表传递的是linklist->next,(所以不需要n,自己本身的数据结构直接减一了)PS:做题记录//14.13-14.35思考递归未果//14.35-14.43用其他方法解除//14.43-14.39思考递归未果,看答案。
2024-11-21 14:34:43
681
原创 【代码随想录】哈希
当我们需要枚举数组中的两个元素时,如果我们发现随着第一个元素的递增,第二个元素是递减的,那么就可以使用双指针的方法,将枚举的时间复杂度从 O(N^2)减少至 O(N),如本题和为固定值0,a,和值不变,b增大,c减小。对两个数组排序的时间复杂度分别是 O(m log m)和 O(nlog n),双指针寻找交集元素的时间复杂度是 O(m+n),因此总时间复杂度是O(mlogm+nlogn)。不能用双指针,首先,要返回的是原来的坐标,如果先排序再用两数之和,那么返回的left和right就是排序后的坐标。
2024-11-21 14:32:37
989
原创 【代码随想录】字符串 (KMP,BF ,扩充数组,for循环固定规律一段处理,整体反转+局部反转,双指针,滑动窗口,库函数)
使用了一个标志来看是否进入了单词区,我使用的是pos标记第一个单词字符位置,用i标志单词的最后一个字符,没有使用标志进入单词区。精妙之处在于双指针的终止条件是i==j相等,因为扩充的是空格的个数,所以相当于i在追j,当追上之后说明空格已经被填满了,前面没有空格了,可以停止,而不是i>=0作为i停止条件。随想录使用的是&,因为最后用了resize()重新定义了大小,所以可以用引用!本题目是将一个字符换成三个字符,使用char类型的数组,该数组长度为原来数组的三倍(最大全替换),最后再返回为真实长度的数组。
2024-11-21 14:32:15
1003
原创 【代码随想录】链表: 递归,虚拟头结点,双指针,栈,哈希
递归深入是压栈的过程,直到链表的最后一个节点的next,然后开始返回,返回到最后一个节点本身,再判断,当前节点(最后一个节点)的值是否等于val,如果等则返回他的next,那么到一上层倒数第二个节点,它的next值就是倒数第一个节点的next;所以是从后往前删除的,因为是删除,所以你要知道它的上一个节点,递归的调用赋值给head->next,即head->next= removeELements(X,X), 而递归参数应该是head->next, 因为要保证该节点的后面所有节点都是没有val的。
2024-11-21 14:14:37
660
原创 【代码随想录】栈,队列(双端队列,单调队列,单调栈,优先级队列)
stack 和queue 是容器适配器,底层容器可为deque,list,vector来实现,默认是deque双端队列,提供O(1)的push_back(),而vector提供均摊的O(1)
2024-11-21 14:13:20
853
原创 【代码随想录】树的遍历题目
针对二叉树的问题,解题之前一定要想清楚究竟是前中后序遍历,还是层序遍历。二叉树解题的大忌就是自己稀里糊涂的过了(因为这道题相对简单),但是也不知道自己是怎么遍历的。
2024-11-21 14:12:09
1001
原创 【代码随想录】树的构建题目
106. 从中序与后序遍历序列构造二叉树题目题目思路:【随想录】搞清楚人做的时候的逻辑:在后序数组中找到最后一个当作根节点利用这个根节点到中序数组中找到该点,作为分割点,将中序数组分割成左右两个利用中序数组的左右数组,再到后续中继续进行分割难点:每次递归的左右区间边界点要弄清楚,即循环不变量,这里用的左闭右开区间。**以下是看了思路后写的,不太对!少了很多东西主要问题是划分边界值,以及少了对特殊节点的判断(空树),大逻辑正确,代码里的注释是错误点反思。class Solution
2024-11-21 14:11:45
610
原创 【代码随想录】回溯
剪枝操作是根据k和n的值来做的,比如k=4,n=4,那么for循环时,只会有一个解即:1 2 3 4,即从1开始的for循环有结果,而从2开始之后的for循环都没用,不可能是解,因为后面取得数个数一定比4小,所以这种情况就可以剪枝,在for循环得startindex上做文章(结合随想录的树形图,注意一个矩形就是一个for循环!回溯的解决方法都可以抽象成为树形结构,回溯法解决的问题都是在集合中找子集的问题,集合的大小就是树的宽度,递归的深度就是树的深度,递归必然有终止条件,因此一定是一个深度有限的N叉树。
2024-11-21 14:11:12
939
原创 【代码随想录】滑动窗口
看的官方题解评论区,发现,每次left可以直接从下一个相同字符的下一个开始,使用map<char,int> int 记录每个字符的位置,出现相同字符则记录的是该字符出现的上一个位置,如abcdefdgh, 当遇到第二个d时left会跳到e, 因为在a-第一个d之间的连续字串的长度都比a-d小,所以这是不必要的循环,直接跳到第一个d的下一个。4. 哈希表如何构造?请注意,你的答案必须是 子串 的长度,“pwke” 是一个子序列,不是子串。解释: 因为无重复字符的最长子串是 “abc”,所以其长度为 3。
2024-11-21 14:10:44
798
原创 【代码随想录】动态规划
2.dp表达式,不用管之前的是否有障碍物即dp[i-1][j],dp[i][j-1], 只需要保证当前计算的dp[i][j]是没有障碍物的。dp[i][j]=dp[i-1][j]+dp[i][j-1]. dp[i][j]可以表示为dp[i-1][j]向下移动一格,或者是dp[i][j-1]向右移动一格。dp[i-j](这里dp[i-j]表示分解数字i-j,得到的最大乘积为dp[i-j]也就是基于之前得到的结果进行的)初始化:dp[0][0]=0 dp[0][1]=1;dp[1][0]=1;
2024-11-21 14:09:53
1007
原创 【代码随想录】贪心
如果当前股票price[i]>buy,说明可以卖出并获得price[i]-buy的收益,但是该结果不一定是最优的,因为后面可能会出现比price[i]还高的价格,所以可以看成是当前我用price[i]买了一只股票,即将buy更新为price[i]-free,后面如果出现了新的高的价格即price[i+1]>price[i]时,就会累加收益price[i+1]-buy (buy=price[i]),相当于是price[i+1]-price[i]k>负数个数时,且数组中有0时,就将多余的k弄到0身上;
2024-11-21 14:09:08
1106
原创 随想录【贪心】
即将一个区间prices[5]-prices[4]分解成(prices[2]-prices[1])+(prices[3]-prices[2])+(prices[4]-prices[3])+(prices[5]-prices[4]),就变成了相邻天数的利润相加。我的思路:只想到了按照左边进行排序,但是不知道怎么选择引爆的位置,以及与下一个气球之间如何有联系,随想录的思路是,将区间左边从小到大排列后,引爆的位置选择重叠气球的右边最小的位置A,这样下一个气球直接看开始位置是否大于A。比如nums[i]=3,
2024-11-21 14:04:09
648
原创 leetcode100滑动窗口
难点是不是对照一样的,而是异位的,所以不能同时进行遍历两个串,这样是比较是否一样。想到的解决思路是26格字母的一个数组进行计数,或者说使用字典,dictionary,然后看是否一致?起码每次滑动的长度是字串的长度,然后就检查一下计数的数组?官方用的双重循环我没搞明白,疑惑点是right++为什么不能写到if外面,是不行的比如:abcb,当right在b的时候,需要将left往右边移动,直到b才能移除重复的元素。我的思路:在一个串中找到另一个字串,字串的位置是错位的。滑动窗口怎么判断有没有重复,使用的哈希。
2024-11-20 15:54:51
207
1
原创 leetcode100双指针
每次找到后一个比自己高的柱子,求出体积减去中间部分的柱子体积,错误的原因,没有考虑周到,只是看着图形想的,但是有可能第一个高,右边遍历就得找比它低的,而我只找到比它高的。正确的思想应该找到一个。另一个思路是不必要每次都交换相邻的,而是当i为0时,用j找到第一个不为0的与i进行交换,然后i继续往后,j也继续往后,有点像简单选择排序算法?思路一样,但是写的精简了,我是先找到第一个i为0的,意思就是不是0,i和j一直同时加,如果是0,那么j一直加。,判断每一个第i个柱子接的雨水,而不是根据图形的个例来设计算法。
2024-11-20 15:53:04
242
原创 Leetcode100子串
这意味着如果你想知道从元素 i+1 到 j 的子数组的和,你可以用 pre[j] - pre[i] 来计算。存储<前缀和’‘i-k’‘,前缀和’‘i-k’'出现的次数>,即看是否有pre[j]存在,存在的话说明存在[j…i]的和为公式:pre[i]-pre[j-1]==k,即pre[j-1]=pre[i]-k;这个题目和上面的题目有点类似,都是三重循环,一层是总的遍历数量,一层left,一层right遍历left到right之间的(k长度)双指针i,j也可以是双端队列,左边i,右边j。
2024-11-20 15:49:15
744
1
原创 0926剑指offer 有不会的
使用一个函数进行判断,返回的是深度值,如果不是平衡二叉树则返回-1。先先序遍历,边计算深度边判断是否是平衡二叉树。ac的,分开来做了,两个递归,效率不高。看的路飞的答案:啊啊不会啊!
2023-09-26 10:58:59
93
1
原创 0925剑指offer
思路:使用辅助栈进行模拟,按照进栈的顺序进辅助栈,进一个就判断是否与出栈顺序第一个相同,相同则出栈,不相同则继续进展,如果最后栈是空的,说明出栈完毕,是正确顺序;答案思路:中序倒序第k大的,则先右,中,左,用一个变量记录第几个,到第k个的时候,返回值,并return。思路:中序遍历放到一个数组里,再找第cnt大的。答案:用了全局变量记录每一次递归的k。8:33~9:30 没看懂题,看答案。8:18-8:30 看答案。8:12~18:18 自己AC。缺点:空间效率为O(N)看了剑的书写的,不对。
2023-09-25 09:40:58
92
1
原创 0924剑指offer
这个题目和上面的有点相似,刚开始按照上面的思路去写,结果不对,因为反转和对称不一样,对称是轴对称,而反转是左右子树反转,小范围的,镜像是大范围轴对称的,因此这个的递归不需要传入两个参数,只需要dfs遍历即可。看了答案后才知道,其实就是一种新的树的定义,就像是二叉树的定义,满树这样的定义一样。【错因】:要判断的是两个树是否对称,所以每次应该传入两个数根节点,判断是否是对称的,而不是像遍历树一样,这样是判断不出来的,我写的是判断同一个树根下的左右兄弟是否值是一样的,而不没有判断整个的树。写的代码如下:是错的。
2023-09-24 12:05:42
74
1
原创 树遍历(先序,中序,后序,层序)
一、树的遍历两种框架:一、深度优先遍历:1.前序遍历2.中序遍历3.后序遍历二、广度优先遍历层序遍历(迭代,队列实现)三种方法:递归,迭代,Morris 遍历栈可以实现递归递归法:中序遍历/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode() : val(
2022-06-28 15:35:07
1300
原创 c++标准库——string用法
定义和初始化初始化string对象的方式:拷贝初始化使用等号初始化一个变量成为拷贝初始化。直接初始化不使用等号叫直接初始化默认初始化 string s1; //s1是一个空串使用对象初始化 string s2(s1); string s3=s1; //s3是s1的一个副本使用字面值常量 string s3("value"); string s3="value"; //s3是
2022-05-17 11:37:16
324
原创 Java面经
三星西安电子研究所——AI软件测试一、 项目:异常检测算法介绍一下你做的最好的项目新闻系统里按关键字查询怎么实现二、 OS:用了哪些操作系统?进程调度算法银行家算法线程和进程区别三、数据结构:双向循环链表实现有序单链表插入图深度遍历广度遍历在函数中,堆和栈,怎么用的char数组,怎么进行查找?哈希查找四、数据库项目里为什么要用sqlite数据库三大范式用过C++吗?做过C++的项目吗博思软件——Java开发JAVA:sshmvc== 和 equal.
2021-03-30 20:38:47
209
原创 王道操作系统第一章总结
1.OS概念、功能、目标一、概念操作系统(OperatingSystem,OS)是指控制和管理整个计算机系统的硬件和软件资源,并合理地组织调度计算机的工作和资源的分配;以提供给用户和其他软件方便的接口和环境;它是计算机系统中最基本的系统软件。二、功能、目标①操作系统是系统资源的管理者。实现对处理机、存储器、文件、设备的管理目标:安全高效②向上提供方便易用的的服务封装思想:操作系统把一些丑陋的硬件功能封装成简单易用的服务,使用户能更方便地使用计算机,用户无需关心底层硬件的原理,只需要对
2021-03-21 11:35:19
202
1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人