- 博客(64)
- 收藏
- 关注
原创 【无标题】
主要是 processing指针和compare指针。(一般后者比前者快。所以判断是后者小于数组长度。然后如果不等于就是就改变processing指针的数字。比如删除重复,条件比较就是后一个数字比前一个数字小。后者是需要条件比较的位置。主要工具:双/多指针。前者是需要处理的位置。
2024-01-26 22:44:31
199
原创 【面试常考150题】1、88合并两个有序数组
输入:nums1 = [1,2,3,0,0,0], m = 3, nums2 = [2,5,6], n = 3。合并结果是 [1,2,2,3,5,6] ,其中斜体加粗标注的为 nums1 中的元素。输入:nums1 = [0], m = 0, nums2 = [1], n = 1。输入:nums1 = [1], m = 1, nums2 = [], n = 0。解释:需要合并 [1,2,3] 和 [2,5,6]。解释:需要合并的数组是 [] 和 [1]。输出:[1,2,2,3,5,6]
2023-12-07 22:47:17
252
原创 leetcode 26. 删除有序数组中的重复项
遍历数组,当这一个数和前一个数重复,跳过。当不重复,填到对应位置,这个对应位置由slow变量记录。
2023-08-04 17:31:23
152
原创 leetcode 21. 合并两个有序链表
当排在前面的罗马数字大于后面的罗马数字,就正常化成阿拉伯数字相加。如果小,那就是将小的数转成负数,再加就ok。但也是需要模拟的,就是哪一字母代表哪个数值。罗马转整数要考虑先后顺序。
2023-07-19 18:01:36
1039
原创 leetcode12. 整数转罗马数字
其实我不需要遍历也不需要知道是几位,我不管是几位,我把这个数都整除一下10*所有位数(因为最大是千位),当整除得到的是0,那意味着这个数没到这么多位或者这一位是0,我不管,当是0时我直接罗马字符加空就行。直接模拟出1-10,10-100,100-1000,1000-3000的罗马字符,我只要知道了这个数是几位,那每一位的数值我都可以取出来,我就可以直接定位C数组。然后每一位的数在哪个区间,我取出来,然后直接相加就ok!那我是不是就要遍历每一位,并且知道目前是第几位?首先难点在于我不知道这个数是几位。
2023-07-19 17:50:45
884
原创 leetcode 11. 盛最多水的容器
当我们往内收指针的时候,矩形的长(我们看作横坐标)会缩小。要使矩形面积变大,只有当宽度增加的时候才有可能。所以如果你的上限是你的短的那一条。而你必须要改变你的上限,才会使得总体面积变大。你移动长的那条挡板,结果永远不会比现在好,为什么?因为矩形长缩小,宽度不会变化甚至可能会变小,面积肯定不会变大。但如果你移动短的那根挡板,如果移动到更长的,你的面积才会有可能变大。要使面积变大,那中间可能又有两根比左右更长的挡板才有可能。然后不管谁先移动,左挡板最终回到最边更长,右挡板最终回到右边更长。
2023-07-19 16:51:11
853
原创 leetcode10. 正则表达式匹配
当s[i-1] 和 p[j-1]匹配时,这个串是否匹配看s[0:i-1]和p[0:j-1]是否匹配就行。1、 p[j-2]消失的情况下,也就是考察s[0:j-1]和p[0:j-2],即dp[j-1][j-2]3、p[j-2]存在多次,其实也是考察s[0:j-2]和p[0:j-2],即dp[j-2][j-2]?2、p[j-2]存在一次,也就是考察s[0:j-2]和p[0:j-2],即dp[j-2][j-2]当s[i-1] 和 p[j-1]不匹配时,不意味着s和p不匹配。当p[j-1]不是,可能不匹配。
2023-07-18 13:15:36
77
原创 leetcode08. 字符串转换整数 (atoi)
这题主要是用到了ascii码,0-9的ascii码是 48-57,直接判断ascii码是不是在48-57范围就ok。+/-号就不用ascii了,因为可以直接判断+和-。注意,这题开头必须是数字,如果不是数字或者正负号,直接返回0。这题不是从字符当中取数值。而是提取字符开头的数字,如果不是数字就返回0。思路就是先判断这个字符是否“合格”,也就是开头是否“有数”。如果有,则下一步,去掉开头的0和结尾的无用字符。最后将字符转为数字格式。
2023-07-17 15:46:07
77
原创 leetcode0007. 整数反转
所以这题是先取个位数,取完把个位数抹掉,即 %10 // 10。而且要注意,反转的话,每加一位之前都要乘以10。老是记不清//和%,//是向0取整,%是取余。对10向0取整就是抹掉个位数。对10取余就是取个位数。
2023-07-14 10:24:00
78
原创 5. 最长回文子串:manacher算法
manacher算法就是遍历到一些中心的时候不需要重新左右扩,因为manacher算法就是排除掉了不可能是最长回文子串的中心,还有以一种巧妙的方式一下子就得出当前回文中心点的暂时左右边界,虽然不是最左和最右,但不需要从中心点开始扩了。fdc__i’__cdeaedc__i__b,这个是i‘的回文左边界在a的左边界之外了。b__i’__cac__i__c , 由于i’的回文左边界在a的左边界上,所以i和i’只能保证在a内相同。a的左边界点到i‘的距离 = i‘坐标 - a + a的回文半径。
2023-07-11 21:53:18
217
原创 4. 寻找两个正序数组的中位数(hard,但很受用,解决了两个数组的topk问题)
怎么求两个等长数组的上分位数?本质也是去掉不可能是上分位数的数字,去掉之后递归这两个数组,知道两个数组长度为1。目的是化为 “两个等长数组求上分位数”等价。也就是求出这两个等长数组的上分位数就相当于求出了topk。这个目的就涉及了两个问题,一个是怎么化成这种形式,另一个就是怎么求两个等长数组的上分位数?分三种情况:k <=短数组长度, 短数组长度<k<=长数组长度, k>=长数组长度。首先是找出两个正序数组并起来的topk,就自然可以求出中位数啦!2、短数组长度<k<=长数组长度。1、k <=短数组长度。
2023-07-11 14:44:53
69
原创 0003 最长无重复子串的长度(多写写)
这题的思路是,某个位置结尾的最长长度,取决于两个因素,一个是当前位置的字符出现在之前字符的位置,还有就是上一个位置的字符往前回去的最长长度(已经求出)。两者的较小值,则为该位置字符为结尾的最长长度。动规的题目某个位置的值肯定取决于之前的位置,很多题都是取决于上一个位置的值。子串子数组的题很重要的一个切入点是:遍历数组,以某个字符为结尾。然后就衍生出模拟法(其实就是肉眼找规律法)和动态规划法。动规的思考模式就是该位置的值取决于什么因素,找出来!
2023-07-07 14:35:39
66
原创 02. 返回arr中达标的子数组的数量
给定一个整型数组arr,和一个整数num。某个arr中的子数组sub,如果想达标,必须满足:sub中最大值 – sub中最小值 <= num,返回arr中达标子数组的数量。子数组不达标,那么大数组肯定也不达标。大数组如果达标,子数组必达标。暴力解为o(n^3)次方。注意:子数组必须连续。
2023-06-08 14:39:17
75
原创 001.leetcode239 滑动窗口最大值
滑动窗口最大值:就是单调双端队列。当列表新来一个元素时,单调双端队列可以常数时间内得到最大值。取最大值最小值只需要o(1),所以总体的时间复杂度是o(n)。给你一个整数数组 nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。总结:当一个列表是空的时候,不能直接if lis == [],而是直接if lis。输入:nums = [1,3,-1,-3,5,3,6,7], k = 3。输出:[3,3,5,5,6,7]返回 滑动窗口中的最大值。
2023-06-08 11:06:03
591
原创 代码随想录算法训练营第49天| 121. 买卖股票的最佳时机、122.买卖股票的最佳时机II
代码思路dp[i][0] 表示第i天持有股票所得最多现金dp[i][1] 表示第i天不持有股票所得最多现金当第i天继续持有,一共两种状态:还有就是之前就买入, 第i天才买入分别是 dp[i][0] : dp[i-1][0] 和 -prices[i]当第i天不持有,也就是第i天那天卖出,或者是之前就卖出了,分别是dp[i - 1][1]和 prices[i]
2023-05-13 11:57:09
64
原创 代码随想录算法训练营第48天| 198. 打家劫舍、213.打家劫舍II、337.打家劫舍 III
代码思路dp[i]:考虑下标i(包括i)以内的房屋,最多可以偷窃的金额为dp[i]
2023-05-05 00:59:16
148
原创 代码随想录算法训练营第43天| 1049. 最后一块石头的重量 II、494.目标和、474. 一和零
代码思路二维数组,这道题的思路难点其实是怎么构建成背包问题。其实就是先构建成标准01背包问题,最后求出最后的最大价值,然后判断最后再判断这个最大价值和背包容量相减就可以。
2023-04-27 21:30:38
88
原创 代码随想录算法训练营第41天| 343. 整数拆分、96. 不同的二叉搜索树
代码思路dp[i]就是答案。状态转移方程是max(i * (k-i), dp[i] * (k-i))。就是分成两种情况,第一种就是两个数相乘,第二种就是超过两个数相乘的情况。i * (k-i)是两个数相乘,dp[i] * (k-i)是超过两个数相乘的情况。但是重点还是先固定一个数,后面还有逐个逐个根据不同固定的数来比较一下。思路比较绕。
2023-04-24 15:29:11
93
原创 代码随想录算法训练营第38天| 509. 斐波那契数、70. 爬楼梯、746. 使用最小花费爬楼梯
代码思路dp[i]代表F(i),然后前面的推后面的,也就是所谓状态转移方程(题目已给出)
2023-04-20 23:29:37
111
原创 代码随想录算法训练营第32天| 122. 买卖股票的最佳时机 II、55. 跳跃游戏
prices = [7,1,5,3,6,4],相邻两个元素只要是大于0,把大于0价差加起来就ok。因为只是问利润,但这并不是具体买卖过程。
2023-04-16 19:07:25
71
原创 代码随想录算法训练营第31天| 455. 分发饼干、376. 摆动序列 、53. 最大子数组和
【代码】代码随想录算法训练营第31天| 455. 分发饼干、376. 摆动序列 、53. 最大子数组和。
2023-04-14 20:49:04
80
原创 代码随想录算法训练营第30天| 回溯算法总结
递归其实本质是对某种数据结构的遍历。我们经常看到,一次递归调用,两次递归调用,多次递归调用。其实这些都是有特定的场景的。首先是单次递归调用,场景其实是一维数据结构的遍历,比如遍历数组、链表等;其次是二次递归调用,场景便是对二叉树的遍历;而多次递归调用,这种情况我们一般能看到会在一个for循环体内进行递归调用,这种其实就是遍历多叉树或者图的场景啦!
2023-04-13 20:36:40
118
原创 4月12日推荐小班第三天打卡
为什么FM算法是MF算法的推广? 准备学习tensorflow1.x和keras FM算法如何减少复杂度? FM算法的特征交叉例子。
2023-04-13 20:12:57
60
原创 代码随想录算法训练营第29天| 491. 递增子序列、46. 全排列、47. 全排列 II
这题剪枝会有点烦,但是刷新了新的思路,就是在无序的数组,删掉重复的条件判断要改成 i > node_index+1 and nums[i] in nums[node_index+1:i]。因为这是树的每一层的广度,不是深度!广度是不可以有重复的。注意,不仅仅是根节点有广度,子节点也有他的广度。
2023-04-12 17:14:56
128
原创 4月11日推荐小班第二天打卡
要课外学习的内容 特征值分解的数学原理课上的问题 搜索的matching和推荐的matching的区别 什么是TF-IDF MCF包括什么模型? EMBEDDING的目的是什么?(从什么空间映射到什么空间) SVD就是矩阵分解法嘛,他和embedding的关系是啥? pre_score = b_t+b_i+b_u+q_u * q_i是什么公式?
2023-04-11 22:41:32
34
原创 代码随想录算法训练营第28天| 93. 复原 IP 地址、78. 子集、90. 子集 II
老套路,两个for加剪枝。但是剪枝的逻辑有点复杂,看看可不可以优化一下?
2023-04-11 21:50:34
34
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人