自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 Leecode560:和为 K 的子数组

这里利用了累加然后通过哈希表寻找值的思想。就是先将前面的数全部加起来,统计出现的频率,再将这个数与目标数作对比,每次查找当前是否存在 当前数-目标数 这个数字的值(代表可以减去得到对应数量的答案),有的话看存在几个,这样就可以不用重复计算的得到可以有多少种结果满足当前的值。这道题用暴力解法时间复杂度会很高,但是涉及到和等于多少的情况,一般情况下会考虑以空间换时间来存储前面获得的信息,然后将答案为某值的结果返回。

2024-05-24 15:05:36 285

原创 Leecode438:找到字符串中所有字母异位词

做这道题的过程中遇到了很多问题,但其实都是自己不够仔细导致的。这道题的思想归根结底就是维护一个滑动窗口,然后在滑动的过程中不断维护不断判断,直到移到最后端然后返回一个维护好的list列表。

2024-05-10 16:35:22 317

原创 Leecode42:接雨水

修改后成功ac,主要注意两点:一是最左端别忘记取,二是别忽视了可能中间的这个是最高的,导致不加一个判断条件的话会导致每列都被计算从而出现负值。看了下题解,发现自己的思路其实没问题,确实是按照最高最低来求,但是这个地方太复杂了求的,每一格单独求才现实。第一反应是按照高低这个思路来求解,因为可以把盛雨水的容器想成是从左往右的,遇到一个沟就存一点雨水。

2024-05-08 10:47:18 252

原创 Leecode03:无重复字符的最长子串

下面这个地方忘了移除哈希集中没用的部分。

2024-04-30 17:32:40 110

原创 Leecode15:三数之和

Leecode15三数之和

2024-04-29 20:28:13 169

原创 【持续更新】java刷题常用数据结构、方法和思路

java算法刷题相关汇总资料,方便刷题前复习和刷题后巩固

2024-04-23 16:29:27 672

转载 理解 LLM 推理过程

参考重复这两个步骤直到生成 EOS token 或达到用户设定的停止条件(stop token 或最大 token 数)。让我们以 Llama2-7B(4096 序列长度,float16精度)为例,计算一下 batch_size = 1的理想推理速度。

2024-04-11 11:29:00 2905 1

原创 Leecode49: 字母异位词分组

Leecode49:字母异位词分组

2024-03-15 11:22:16 374 2

原创 八股总结(招聘)

线程创建方法:

2023-10-20 09:23:31 93

原创 Leecode 128:最长连续序列

正确的做法是找规律,先将所以数据存入HashSet中(因为这里不需要数量只需要知道有没有这个索引),想明白如果一个数它是不是最长的部分,只需要先知道它是不是第一个即可,如果不是那可以直接跳过,节省程序的时间。第一反应是先排序,然后从前往后遍历判断最长的连续序列,但是这样可能会导致时间复杂度过于高。

2023-10-17 21:50:06 111 1

原创 Leecode121: 买卖股票的最佳时机1 & 2 & 3

在第二天买入,在第五天卖出,和不断买入卖出是一样的,所以也是维护一个最小值。这道题这里的思路不是动态规划,而是贪心算法。第一个思路是从前往后进行遍历,记录一个最小值,然后往后维护一个最大值,不停的减去即可。问题出在用了两个第二个的循环!但是分成两边也会有多次交易!分别表示第一次买入,第一次卖出,第二次买入,第二次卖出。预期是6,输出是8,说明算法内部有错误。

2023-10-03 15:38:31 154

原创 Leecode56:合并区间(贪心算法)

第一眼看到这个题目觉得应该是比较第一个值的大小,因为如果第n个值比n-1个值的右边还小于等于,那么说明区间可以连起来。千万记得排序后分清楚哪个是原本的哪个是当前的!以及新加一个不可以直接加{L, R},需要开辟一个新空间!Arrays.sort()函数里,

2023-09-27 17:35:05 302

原创 Leecode83: 删除排序链表中的重复元素

这道题注意的是,当有重复的时候,不用管,继续往后找,因为前面指向的是这个函数而非这个函数的头节点,只要找到第一个非相等的值,或者为空(一个道理),返回作为前面head调用next。这道题就是记录一个之前的节点,或者使用递归的方法,因为重复的都是不需要,注意递归的时候要注意,返回的条件是什么。

2023-09-22 21:56:34 60

原创 Leecode1143: 最长公共子序列(不是子数组!)

这道题是一个动态规划的题目,注定了时间复杂度是O(n^2),思路就是从第一位开始往右比较(假设第i位是开头,对应的第二个字符串有多少个字符是匹配的呢?),一看就是使用动态规划的方法。但是这道题和之前不太一样的就是,不需要连续的,只需要一部分中有最多相等即可,所以最重要的是最后一位,并且不要考虑优化时间复杂度,没可能,并且dp[0]的位置一般要空出来!

2023-09-22 21:54:36 54

原创 Leecode 215:数组中的第K个最大元素(堆排序实现)

看到这道题的第一思路就是是堆排序的经典应用场景,大根堆找出最大的到最小的,小根堆找出最小的到最大的(唯一的区别就是大于和小于的判断)。首先需要知道节点的个数,借助完全二叉树的性质。分为三个函数,一个是主函数,一个是建立大顶堆的函数(初始化,从总长度的1/2开始,往下是子节点无需考虑),一个是大顶堆化(一个一个从下往上比,然后如果交换了值需要进行往下的递归)。在大顶堆化的时候要注意两点:1是左右值需要记清楚,2是千万记得判断是否越界,不然会存在内存问题。

2023-09-21 16:23:25 70

原创 Leecode1160: 拼写单词

直接使用一个哈希表存整体的结果,一个临时的哈希表每次算一遍,但是1是要设置标志位来判断最后是否正确并加上长度,2是千万要记得每次新建一个空间来存哈希表绝对不能不空间就等于,会出事!

2023-09-13 23:12:10 413

原创 Leecode76: 最小覆盖子串

首先复习一下ACSII码的知识,ASCII码总共有128个,先是数字,然后是大写字符,最后才是小写字符。所以设置一个128大小的数组就可以解决这个问题。这道题我的第一反应就是设置一个滑动窗口,因为之前遇到过类似的题目。left该怎么正确的右移呢。

2023-08-31 13:40:33 81

原创 黑马点评环境搭建导入

一开始配置maven的时候,发现怎么都无法查看maven的版本,后来才知道是JAVA_HOME的问题,开头多了一个空格(因为我是直接复制过去的),然后搜网上通过命令行可以看到肉眼看不到的bug。在pom.xml文件中存在配置一直不对,说驱动错误,一看发现是mysql版本写错了,将5.xx改成8.0.32就行(实际上是8.0.34,但是其实没有这个映像,所以降低版本也可以)。服务-Mysql80-启动Mysql,才可以连接Mysql数据库,解决了Mysql问题后,就不报错了!发现和上次登录的ip不同了!

2023-08-30 20:16:25 465

原创 Leecode316: 去除重复字母

peek()返回的是第一个元素,等同于getFirst()!所以绝对不能使用peek!一直出错,以后谨记,LinkedList是两边都是LinkedList不能是List,其次一定要用getFirst和getLast,addFirst和addLast,removeFirst和removeLast这样,绝对不可以使用别的不然容易搞混!下面这里使用有序map——TreeMap来实现Map接口,但是相对顺序是不能改变的!最简单的思想肯定是暴力思想,就是从前往后寻找,一旦遇到存在的情况就.

2023-07-18 17:58:32 96

原创 Leecode402:移掉 K 位数字

这道题一看想的是可能用回溯或者什么别的方法,但是那样的话时间复杂度非常高,而且也不适用于动态规划,所以观察的话,可以知道从前往后判断的话肯定是前面越小越好,所以只需要前面最小,整体就最小。因此从前往后进行判断,如果后面的比前面的小,那么就删除前一位(之所以是前一位是因为在从前往后的过程中前一位一定是前面序列里最大的),然后不断后移,只要移动的位数等于了k那么就说明已经找到了最小。下面存在的问题是,在LinkedList中,判断是否为空的方法是使用isEmpty()函数,而不是不等于null!

2023-07-17 17:23:48 204

原创 剑指 Offer 41: 数据流中的中位数

首先,因为是三个函数都要使用的队列,所以声明要写在函数外,类体的开头。还有个要注意的,由于两个队列存的值都是int类型,所以除出来的结果也是整数,最后才会转为double,所以得除2.0!还有最好用offer()和poll()而不是add()和remove()!addNum\textit{addNum}addNum: O(log⁡n)O(\log n)O(logn),其中 nnn 为累计添加的数的数量。空间复杂度:O(n)O(n)O(n),主要为优先队列的开销。

2023-07-06 22:04:16 138

原创 剑指 Offer 17: 打印从1到最大的n位数

这里注意,1是List的实现是用ArrayList,2是从1开始(10是第一个二位数的值),3是终止条件是当前长度等于位数限制,4是递归调用每次在结尾加一个小的值,并且当前长度也要加1,5是注意字符串的拼接方便和最后使用parseInt将其转化为int值的过程,6是在返回的时候想取List中的值要用for来做。首先,List类型的要么存Integer,要么存int[],并且后面实现是用ArrayList!这边的i和j应该从1开始,因为0不能做高位也不能做位数。

2023-07-06 17:41:10 212

原创 剑指 Offer 37: 序列化二叉树

然后从前往后判断,由于层序遍历的规则很简单,第一个的子节点是2,3,如果为空那么这个节点就是根节点没有这个子节点(约等于跳过)。Integer中的parseInt可以将字符串转为int类型的变量,很好用。这道题很复杂,首先需要发现是层序遍历,因为只有层序遍历才是这个顺序,并且new就可以调用,说明这里里面就生成了一个新的String(可以new一个String),给StringBuilder初始化一个],然后给队列加进根节点,和经典层序遍历不同的是这里为空也要加进队列,只是不给它分配左右节点。

2023-07-06 17:18:29 109

原创 剑指 Offer 67: 把字符串转换成整数

这道题使用的办法是先判断是否有符号,把空格消除,然后用一个标志位判断是否为负数。当遇到这种问题记得调用Integer中的MIN_VALUE和MAX_VALUE这样最方便。

2023-07-06 16:26:29 89

原创 剑指 Offer 43: 1~n 整数中 1 出现的次数

2 3 0 4 千位和百位可以选00 01 02....22 十位可以取到1( 形如[00|01..|22]1[0-9] 都是<2304 ) 个位可以选0-9 共有 23 * 10 中排列 当千位和百位取23,如果十位取1 那就是形如 231[0-9] > 2304,所以当千位和百位取23,十位只能能取0,个位取0-4即 2300 2301 2302 2303 2304 但是2301不应该算进来,这个1是 单独 出现在个位的(而11,121,111这种可以被算多次) 即 23*10。这样的确是最简单的。

2023-07-06 11:21:29 74

原创 剑指 Offer 44: 数字序列中某一位的数字

这里很奇怪,但是在调试的时候发现是越界了!导致nine*plus超出了int的表示范围。这里要不用Long类型的值来表示,要不用除法代替乘法。下次一定要注意大数越界的事情!这道题的规律是10*1,90*2,900*3,9000*4……这道题只需要判断每一个临界点,找规律找的很对。这里错的原因是因为没有仔细审题,下标5对应的值是5,所以应该是减去9才对。

2023-07-06 10:34:59 81

原创 剑指 Offer 62: 圆圈中最后剩下的数字

这有点像一个首尾相连的链表,但是那样时间复杂度太高了,这道题找规律,很巧妙,从尾部的结束状态开始往开头推,每次判断当前被保留下来的数在上一轮循环里是几?只要加上走了的路径除以那个时候的长度状态就可以。

2023-07-05 22:41:16 45

原创 剑指 Offer 57 - II: 和为s的连续正数序列

首先看到返回值和题给条件明确这是一个滑动窗口任务/可变数组 ,所以要使用List,然后其中元素又是数组,所以类型为int[],构造使用ArrayList,left不能从0开始,返回的时候由于是List,所以创立一个和vec一样大小的一维数组后面不给值,按照Int[]的元素遍历后写入res中然后返回。这里从0开始先然是不对的!滑动窗口思想很好用,相等了必定移动左边!

2023-07-05 22:02:49 124

原创 剑指 Offer 14- II: 剪绳子 II

这道题错的原因在于res在存储过程中会越界,最轻微的上溢是 INT_MAX + 1 :结果是 INT_MIN。最严重的上溢是 INT_MAX + INT_MAX :结果是 -2。最轻微的下溢是 INT_MIN - 1 :结果是 INT_MAX。最严重的下溢是 INT_MIN + INT_MIN :结果是 0。最大值加1时,反而变成范围的最小值,加2变成范围的次小值,这种情况可以想象出一个循环。这道题不能使用动态规划来解决,因为会越界。用贪心算法找规律可以得到答案(3越多越好,小于等于4取本身的值)

2023-07-05 19:06:55 256

原创 剑指 Offer 14- I: 剪绳子

这个地方使用dp数组来存储当值为i时候的结果,当到达n的时候说明答案就是这个。这里错的原因是一旦dp多申请了一个空间,那么就需要在循环的时候加个等于号!每次[i-j]和[j]就是在试组合!循环从4开始,因为小于4的结果都被返回了。这道题在代码随想录看到过,就是拆分成若干个2和3的乘积,然后另一个数不能再分的时候是最大的。但是那样太主观了,这道题正常思路就是使用动态规划来解决。

2023-07-05 17:50:03 53

原创 剑指 Offer 66: 构建乘积数组

这道题第一反应就是暴力解法,从左往右遍历两个for循环,这种情况的时间复杂度是O(N^2),明显不是个好办法。用左右乘积列表来表示是个非常好非常巧妙的办法!每个元素都设定一个左右的乘积数组,最后答案就是将这两个值相乘即可。上面的空间复杂度是O(N),但其实空间是可以省略下来的,只要使用两个循环,先从左往右乘一遍,再往右从左乘一遍(右往左的时候用一个值保存右往左的乘积和)。

2023-07-05 17:23:10 55

原创 剑指 Offer 39: 数组中出现次数超过一半的数字

或者可以先排序,中位数就是要找的数(因为占了一半所以排序后的数组中间值一定为答案)。这样的时间复杂度是O(N*log(N))有个很妙的方法,就是分为大数和其它两个,使用count来区分。这样的时间复杂度是O(n)。看到这道题两个想法,一个是暴力(用一个临时数组存);

2023-07-05 16:55:14 57

原创 Leecode416:分割等和子集(0-1背包解决)

这道题使用的是01背包问题,由于每个值只能取一次,所以可以想到既然分成两个相等就代表两者之和等于sum,所以除就是其中一个的和,并且值必须为偶数不然除不尽!dp要比原本的大一个储存为0的情况!倒序遍历从target开始,到nums[i](当前物品的空间,最小值)结束。

2023-07-05 10:23:13 68

原创 剑指 Offer 19: 正则表达式匹配

这道题就是状态的判断:是否两个都为0?只有两个都为0才为true,并且判断*,有两个情况:为*或者不为*,不为*直接前移判断比较,否则就两种情况,忽略或者比较二选其一,只要两个或有一个成立即可!可能存在一个现象,就是aaab,然后a*ab,那么这样*只能代表一个a。这道题可以使用动态规划的方式来解决。

2023-07-04 10:56:32 67

原创 剑指 Offer 56 - II: 数组中数字出现的次数 II

这里的方法很巧妙,也是运用位运算的方法,因为每个数它在每个位上1的个数至多为1,而如果重复了3次那么这个就是为0或者3,所以可以使用一个length*32的双重循环来解决。并且还是要注意优先级的问题!这道题比上道题复杂得多,因为是3所以不能使用异或的方法。

2023-07-03 16:11:38 40

原创 剑指 Offer 56 - I: 数组中数字出现的次数

这道题有点想先排序,但是看到空间复杂度只有O(1),所以也不能使用哈希表。但是思路和之前那个找出所有数中唯一的数一样,全局异或开始!千万要记住,&的优先级比==还要低,所以以后在写符号运算类的题目时记得要打上括号或者和等号分开,一旦看到这种错误立马想到优先级问题!找出两个数中不同位的数!

2023-07-03 15:05:07 115

原创 剑指 Offer 65: 不用加减乘除做加法

1、公式是 s = n + c,但是题目不能用加号,所以只能循环套娃直到进位为0,这样就不需要加号了,此时s = n。2、为什么可以循环运算,因为求进位的时候左移了1位,低位补了0,所以最终结果进位一定会左移到0这个值,如果进位不能左移到0,那这题用这个思路就做不出来了。就是两个相同位置数值都为1的时候,那么就会往前进一位;两个都错开没有进位的时候,一个异或运算就可以得到结果(因为1+0=1,并且最后数字的表示也是1/0形式)。这道题想着使用一位一位进位的方法做,写这个的时候忘记了异或运算符!

2023-07-03 11:23:50 105

原创 剑指 Offer 15: 二进制中1的个数

这道题明显要用符号运算,傻逼了这还要想半天。注意:n&1的结果和c++不同,是1/0不是true/false!并且这里的n可能是负数!只能说不等于0绝对不可以说大于等于1!这里错了一个很重要的地方!就是右移首先用>>>才行,这样补0,如果用>>可能会高位补1!

2023-07-03 10:38:30 46

原创 剑指 Offer 60: n个骰子的点数

这道题就是按照上图思想,每一个后置(n)和前置(n-1)概率是相关的,就是对于每个位置上的概率再乘1/6然后加上,j+k就是这个索引的位置,所以不会漏掉。类似滑动窗口的,不是找规律!还有可以直接相等,将大小6的数组指向更大的就行!这道题首先看的出来概率两边是对称的,并且概率也是按照筛子个数上升的。

2023-07-03 09:57:12 50

原创 剑指 Offer 49: 丑数

这道题看了解答才知道原来是用基数(1)不断与(2,3,5)相乘,然后再将得出的结果重复这个操作。所以记录乘到哪个位置很重要。因为要记住,每个节点都有一次乘2/3/5的机会,所以从dp[0]开始给这个机会。然后判断是哪个位置的哪个(*2,*3,*5)项目被调用了,指针后移一位。这个用动态规划,本质上也是因为后面的丑数是由前面的生成的,所以对于乘几的处理这里非常巧妙,公用三个变量,移动到哪就使用哪个(使得这个数最小)。

2023-07-02 17:32:34 51

空空如也

空空如也

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

TA关注的人

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