- 博客(66)
- 收藏
- 关注
原创 面试经典150题【141-150】
剪枝:我们可以使用 Trie结构进行建树,对于任意一个当前位置 (i,j)而言,只有在 Trie 中存在往从字符 a 到 b 的边时,我们才在棋盘上搜索从 a 到 b 的相邻路径。对所有的边缘O进行dfs遍历,将其变为#.再将所有的内陆的O变为X,再将#变为O即可。首先一个多叉树里面应该有两个属性,是否结尾,下面的元素。添加的时候,如果没有,就新增一个TrieNode就行。当然对于DFS,更通用的模版是先访问,不管是否能访问。最广泛的是用BFS去得到每一个入度为0的,直到最后。
2024-04-06 10:56:20
575
原创 面试经典150题【131-140】
/ 找第一个等于target的位置// 重点} else {// 最后一个等于target的位置left = 0;// 重点} else {以找最左边的first为例,即使找到了,也要再做一次right = mid-1;继续遍历。直到不等于(即越界)
2024-04-03 17:17:59
1204
原创 面试经典150题【121-130】
如果不想提前塞入[2,6]这后面四个的话,可以选择当弹出 j=0的时候同时塞入(i,j+1)和(i+1,j)比如nums1={1,2,3,4,5}. nums2={6,7,8,9,10}先把[1,6],[2,6],[3,6],[4,6],[5,6]塞入到优先队列里。每次出来一个就选择(i,j+1)塞入队列,比如[1,6]出来了就塞入[1,7]左边维持一个大根堆,右边维持一个小根堆。要不只塞左上角一个,如果弹出的是第一列的,还要再多塞入一个下一行的最左边的。对于{-1,-1,-1}这种,也要取一个数字。
2024-03-31 00:09:23
962
原创 面试经典150题【111-120】
建立数组的时候长度要加一,不然直接dp[0][0]为s1前1个字符和s2前1个字符能不能组成s3的前2个字符,这显然是不合适的。其中,dp[i-1][j-1] 表示替换操作,dp[i-1][j] 表示删除操作,dp[i][j-1] 表示插入操作。第一行和第一列用来缓冲,1 到 length 这些索引才是符合题意的,因为要兼容第二行的 i-1,j-1之类的需求。dp[i][j] 表示 由s1的前i个字符 和 s2 的前j个字符,能不能组成s3的前 i+j 个字符。M是很大的,N是很小的。
2024-03-27 20:12:34
996
原创 面试经典150题【101-110】
用哈希表就是,先确定一个点(N),计算与其他所有点(N)的斜率,将斜率k存储到哈希表中。先在每一行下棋,然后下一行,然后回溯到这一行没下。递推公式: dp[i][j]=dp[i-1][j]+dp[i][j-1];然后ij都从1开始循环也蛮好的。暴力的话就是先确定两个点,再依次遍历其他的点,看斜率是否等于AB的斜率。HashMap应该是针对于每一个 i 点的,则每一个 j 点都要统计。三个点,ABC,AB和BC的斜率应该一样。这个是倒序的,从三角形的下边到上面。直接二分去搜,牛顿的数学太复杂。
2024-03-26 22:47:30
422
原创 面试经典150题【91-100】
排列问题,讲究顺序(即 [2, 2, 3] 与 [2, 3, 2] 视为不同列表时),需要记录哪些数字已经使用过,此时用 used 数组;组合问题,不讲究顺序(即 [2, 2, 3] 与 [2, 3, 2] 视为相同列表时),需要按照某种顺序搜索,此时使用 begin 变量。做一个helper函数,终止条件,dfs,这一步要加的,dfs,减去这一步加的。注意dfs中的i , 从begin到len , 并且也要传递到下一个dfs中去。一维dp的子问题,基本就是与dp[i-1]和dp[i-2]有关系。
2024-03-25 21:27:37
915
原创 面试经典150题【81-90】
如果 key 不存在,使用 key 和 value 创建一个新的节点,在双向链表的头部添加该节点,并将 key 和该节点添加进哈希表中。然后判断双向链表的节点数是否超出容量,如果超出容量,则删除双向链表的尾部节点,并删除哈希表中对应的项;通过哈希表定位到该节点在双向链表中的位置,并将其移动到双向链表的头部,最后返回该节点的值。如果 key 存在,则与 get 操作类似,先通过哈希表定位,再将对应的节点的值更新为 value,并将该节点移到双向链表的头部。截取出那段要反转的链表,然后用多个节点,遍历即可。
2024-03-18 23:23:22
983
1
原创 面试经典150题【71-80】
首先要明白,maxGain求的是什么,求的是经过我这个root节点以后,单边的最大值。因为只有这样,才能搞 root.val +maxGain(root.left) +maxGain(root.right)的值为最大。不过因为是完全二叉树,则可以判断是否完全,若是完全则直接2的n次方-1,否则就DFS,简单的BFS即可,当 i == size -1 的时候加入答案数组中。要不p,q在root的两侧,要不p和q其中一个是root一个是小弟。如果找到一个节点,就返回一个节点。如果只有一个有值,则为其中的一边。
2024-03-10 10:30:30
475
原创 面试经典150题【61-70】
根据preorder[0]去切开Inorder数组,并且得知数量后,再行切开preorder数组,最后迭代即可。新建两个链表,一个里面的值恒小于x,一个里面的值恒大于等于x,再合并两个链表即可。树这边还是用递归,先处理自己的逻辑,然后直接扔给左右子节点。BFS就是创建一个队列,一行一行遍历。看看能遍历几行罢了。直接先序遍历放到数组里,然后挨个取出来建立新树即可。第二步:找head, 第三步:断环。永远是最左边的和最右边的想比较,然后往里面靠近。树的问题最经典的就是DFS和BFS。树这里就是递归去做就行。
2024-03-08 16:43:54
456
原创 面试经典150题【51-60】
比如我在栈一塞入[ 1,2,3] ,那我在最小栈就塞入 [ 1,1,1] ,然后弹出的时候一起弹出就行。设置虚拟节点0,当有两个数相同的时候,cur.next.val == cur.next.next.val。最后,我们然后map.get(head),也就是对应的新链表的头节点,就可以解决此问题了。map.get(原节点.random),得到的就是对应的新节点.random。map.get(原节点.next),得到的就是对应的新节点.next。从上图中我们可以发现,原节点和新节点是一一对应的关系,所以。
2024-03-04 11:44:40
1089
原创 面试经典150题【41-50】
方法二:哈希表记录[k,v]—> [ nums[i],i] ,如果包含则比较与i的距离,大于k则将[nums[i],j] 赋值给[nums[i],i] ,继续遍历。然后再遍历一遍Set, 如果包含 nums[i]+1,依次遍历有没有nums[i] +2, nums[i] +3 等等。可以放到map里 [key,value] ->[ nums[i], 左右最长的长度]先按左区间排序,然后依次遍历,根据 nums[i+1][0] 和 nums[i][1] 判断是否需要合并。所有的这种二维数组的,都要先排序。
2024-02-28 18:58:50
940
原创 面试经典150题【31-40】
给定一个 m x n 的矩阵,如果一个元素为 0 ,则将其所在行和列的所有元素都设为 0。请使用 原地 算法。定义三个数组,int [][]row, row[i][j], i代表第几行,j代表出现的元素。每个出现的字符都应当映射到另一个字符,同时不改变字符的顺序。然后用map.put(words[i],i) 与 map.put(s[i],i)判等就行。关键是找到公式: matrix[i][j] -> matrix[j][n-1-i]box[i][j], i代表第几个小格子,j代表出现的元素。
2024-02-26 16:54:05
1029
1
原创 面试经典150题【21-30】
若向内 移动长板 ,水槽的短板 min(h[i],h[j]) 不变或变小,因此下个水槽的面积 一定变小。若向内 移动短板 ,水槽的短板min(h[i],h[j]) 可能变大,因此下个水槽的面积 可能增大。正常的话要考虑两个东西,一个是找不到则答案输出为0,还有是因为是Min函数,要考虑ans的初始值。要不就是移动到已有的(在Pianyi数组中),要不就是全部移动(移动nSize+1)2.当前行不是最后一行,且只有一个单词:该单词左对齐,在行末填充空格;先定一个first,然后就是求两数之和,双指针。
2024-02-24 17:20:58
1136
原创 面试经典150题【1-10】
在每一天,你可以决定是否购买和/或出售股票。你也可以先购买,然后在 同一天 出售。1,4,7,3,6,2,5,1.是有顺序的,也可能是几个顺序环。然后倒转前k个,还有后面的几个。5,6,7,1,2,3,4即为答案。要注意他写的是,只左移动(right–)或只右移动(left++)或者定义一个大数组来计数,这个数组也不是很大,因为H指数最大就是n。如果右边扔进来的也是val,那么在下一次循环的时候还会再扔。length − 这是要复制的数组元素的数量。3.先全部倒转,7,6,5,4,3,2,1。
2024-02-17 23:26:04
1254
原创 剑指offer11-20
所有的dfs都是从每一个点开始,往所有方向遍历,dfs的参数列表还要传一个全局的数组去判断合不合适继续往下走。n&(n−1) 解析: 二进制数字 n 最右边的 1 变成 0 ,其余不变。肯定不是遍历一遍O(N),这种变相有序,也是二分。二分也不容易啊,要思考。先处理负数,然后要提前处理奇数。其实最后当b==1的时候也要处理奇数。或者直接调用Integer.bitCount(n)
2023-08-14 19:39:58
206
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人