- 博客(52)
- 收藏
- 关注
原创 Problem #30 [Medium]
首先,很容易想到从左到右遍历,从右到左遍历分别找到比当前高度大的值,然后拿到最小值减去当前高度就是可以接到的雨水量。空间复杂度为O(N), 时间复杂度为O(N), N为height数组的长度。接下来思考如何才能做到O(1)的空间复杂度呢?对于每一个高度i,我们要找的是它。
2024-06-24 14:40:41
392
原创 Problem #27 [Easy]
首先很容易想到用栈去解决,空间复杂度为O(N), 时间复杂度为O(N), N为括号字符串的长度。那有没有空间复杂度为O(1)的解法呢,有的!我们可以借用双指针的方法。
2024-05-06 11:34:39
241
原创 Problem #18 [Hard]
其次,最容易想到维护一个最大堆,每次弹出堆顶元素。时间复杂度为O(NlogN),空间复杂度为堆占用的O(N)。暴力方法如下,时间复杂度为O(kN),空间复杂度为O(1),这里我们不算入答案数组占用的空间。我们可以利用双端队列保存索引值,且队首只会保存当前窗口的最大值索引值。那如何实现O(n) time and O(k) space呢?
2024-05-02 22:55:23
197
原创 Problem #19 [Medium]
,额外空间为all_color_combination生成元组的数量乘以每个元组的长度,因此空间复杂度为O(N*K。其实本题和Problem #9很像,可以自行搜索前文。9中我们只有选和不选两种选择,现在是K种选择。暴力解法是把所有房子满足染色要求的选择列出来,然后选个成本最小的。空间复杂度就是dp数组O(NK)上述方法时间复杂度为O(K。时间复杂度为O(N*K。
2024-04-28 18:55:53
215
原创 Problem #21 [Easy]
假设最大的end time为10000。这里我们维护一个prefix_sum数组来保存边界,左边界为1,右边界为-1。
2024-04-28 13:53:15
144
原创 Problem #16 [Easy]
由于题目要求尽可能少的使用空间和时间,毫无疑问最少肯定要用N个空间存储order_id。这里我们用到的是环形数组。
2024-04-24 13:42:19
225
原创 Problem #15 [Medium]
在循环的第 i 次迭代中选择随机元素时,假设我们已经从 [0, i - 1] 中统一选择了一个元素。为了保持循环不变,我们需要以 1 / (i + 1) 的机会选择第 i 个元素作为新的随机元素。对于 i = 0 的基本情况,假设随机元素是第一个。这是个经典面试问题:蓄水池抽样。如果没有内存限制,我们可以把stream存到一个列表中,然后从[0, size-1]中随机选择元素,空间复杂度为O(N)。对于 i = 0, we would’ve picked uniformly from [0, 0].
2024-04-22 17:19:29
335
原创 Problem #14 [Medium]
说实话,这个问题我曾经在19年面试Amazon applied scientist intern的时候问到过。首先,什么是蒙特卡罗方法。In short就是基于重复随机取样获得数值结果。
2024-04-22 14:10:39
218
原创 Problem #12 [Hard]
首先确定dp数组定义,即爬i层楼梯有dp[i]种方法;然后思考递推公式dp[i] = dp[i-1] + dp[i-2]。其中dp[1]=1, dp[2]=2。对于follow-up的问题,递推公式稍稍变化即可。
2024-04-19 23:55:07
315
原创 Problem #10 [Medium]
总之,asyncio 由于其轻量级特性和高效的事件循环,通常更适合 I/O 密集型任务和高度并发的应用程序。Asyncio:Asyncio 不受 GIL 的约束,非常适合 I/O 密集型任务和协作式多任务处理。我觉得面试的时候可以向面试官问清楚,要执行的function是io-bound操作还是cpu-bound操作,这里我用的协程方式实现,也可以采用thread方式实现,Asyncio:Asyncio 更轻量级,因为它使用协程,协程比线程更轻并且开销最小。这会限制 CPU 密集型任务的可扩展性。
2024-04-17 12:18:12
278
原创 Problem #9 [Hard]
很容易想到是动态规划,前一步的选择会影响后续的结果, 而且每次选择都是重复的子问题。这道题的重点是用二维数组定义dp数组。dp[i][0]表示没有选择当前元素的最大和, dp[i][1]表示选择当前元素的最大和。初始化dp[0] [1]= arr[i], dp[0][0] = 0;(你可能想定义dp数组为dp[i]为直到第i个元素的最大和,但是根本没法初始化,所以我们拆成二维数组)第二,思考状态转移方程。当前元素只有两种选择,被选中作为最大和的加数或者不被选中作为最后结果的加数。
2024-04-16 22:01:29
293
原创 Problem #7 [Medium]
第二种情况是使用了两个字符,即s[i]和s[i+1]。= ‘0’, s[i]和s[i+1]组成的整数不超过26。第一种情况是当前选择了一个字符,即s[i]。= ‘0’, 就可以解码成A-I中的某个字母。='0’且10⋅s[i]+s[i+1]≤26。第三,初始化f[0] = 1, 即空字符串有1种解码选择,解码出一个空字符串。将上面的两种状态转移方程在对应的条件满足时进行累加,即可得到f[i]的值。首先定义f[n], 即长度为n的字符串有多少种解码选择。
2024-04-14 16:53:46
274
原创 Linux command | 进程 | ps
ps命令是当在Linux系统上进行trouble shooting时最常用的命令之一。它有很多选项,但最常用的就是ps aux或者ps -ef来收集运行进程的信息。其他选项查询man7 page。
2022-10-12 16:44:53
519
原创 记intel
模拟 inner join:归并的思路#include<bits/stdc++.h>using namespace std;int main(){ vector<pair<int,char>> list1 ={{1,'a'},{2,'b'},{2,'c'},{3,'d'}}; vector<pair<int,char>> list2 ={{1,'e'},{2,'f'},{3,'g'},{4,'h'}}; int p1
2022-04-15 14:51:55
125
原创 记google面试(应该暂更)
个人介绍+项目经历+重点介绍一个项目coding题目:求某个排列在所有全排列中的索引。(索引从1开始)Given a certain permutation of n literals (e.g. BCDA is a permutation of literals ABCD). Find out its index of this permutation in the full permutation of these n literals when sorted in alphabetical or
2022-01-12 16:15:02
298
原创 一份数据结构的快速review
每次面试前我都要重新回顾下题型,找下手感。我觉得基础和经典题型必须会写等等,面试时候沉着应对,一步步思考就可以。以下内容仅供个人复习参考。首先是最基本的数据结构:数组和字符串(顺序存储)涉及两大类问题:查找:1)顺序查找;2)二分查找;3)哈希查找;排序:八大基础排序常用技巧:双指针法(做题下来,感觉可以分为头尾指针or快慢指针,注意下两者的循环终止条件,理解头或尾,快或慢分别代表什么就可以了)。滑动窗口(其实是高级点的双指针,可以解决很多子字符串匹配和子数组问题)。其中,滑动窗口的整体
2022-01-06 17:12:44
419
原创 Hulu面试(或许待更)
2022/1/5首先是电面,时长一小时。自我介绍+项目介绍+实习内容+中间穿插问题。coding:反转链表、k个一组翻转链表(lc原题改进,不同之处在于不满k个也要反转,细节比较多)面试官人很好,面试体验很好。...
2022-01-06 12:35:47
942
原创 二分查找总结
查找和排序可以说基本功中的基本功了。其中包括顺序查找O(n)、二分查找O(logn)、哈希查找O(1)。下面总结二分查找的基本题型,仅供个人学习交流。首先,二分查找一定是在数组有序的情况下进行的。寻找一个数在这里插入代码片...
2021-12-22 18:55:25
305
原创 记微软面试
我是三月份就做好笔试,由于个人时间问题顺延了,但好像给我标漏了不管怎样,终于赶上了最后的补录面试吧----------------------------分割线------------------------------------------2021/6/7 11:00-11:45first round全程英文面,面试官英语超流利个人介绍介绍一个自己的项目以及项目的难点(业务的东西没有深问编程:给定一个整型数组,找出和为正数的子数组个数。就首先想到的就是暴力了呗,时间复杂度为O(n2n^
2021-06-09 21:26:47
584
2
原创 Optimization algorithms
优化算法(一)Mini-batch gradient descent如上图所示,批量梯度下降法对训练集的一轮处理只能得到一步梯度逼近,而小批量梯度下降法中对训练集的一轮处理也就是一次遍历,可以得到5000步梯度逼近。其中,训练集的一次遍历叫做一个epoch。在批量梯度下降算法中,每一次迭代将遍历整个训练集,代价函数的值应该随之不断减小。如果某一次迭代值增加了,那么一定是哪里错了。也许是学习率设置的太大。在小批量梯度下降中,并不是每一次迭代代价函数的值都会变小,但是整体趋势必须是向下的。之
2021-04-29 17:09:52
245
原创 Improving Deep Neural Networks
在实际应用中如何使得神经网络高效工作包括数据准备、超参调整、优化算法等。(一)数据准备:Train / Dev / Test sets目前应用机器学习是高度迭代的过程,而恰当地将机器学习任务的数据划分为训练集、开发集和测试集能有效提高迭代效率。其中:Training set:训练模型,尝试不同的模型结构Dev set or hold-out cross validation set:选出不同训练模型中效果最好的Test set:对效果最好的训练模型进行无偏评估,也就是对你最终所选取的模型给出可信
2021-04-26 19:11:18
212
原创 单调栈和单调队列总结
总结下面经中常考的栈和队列题目,仅供个人日后复习。用两个栈实现队列用两个队列实现栈根据栈的压入序列能不能得到给定的弹出序列包含min函数的栈以上题目告诉我们:要适当构建辅助栈。另外,还有一种单调栈的简单数据结构。单调栈实际上就是栈,只是利用了一些巧妙的逻辑,使得每次新元素入栈后,栈内的元素都保持有序(单调递增或单调递减)。单调栈用途不太广泛,只处理一种典型问题,即next greater element。Leetcode 496:下一个更大元素 I题目描述:给你两个 没有重复元素
2021-03-23 21:58:22
369
原创 python中的四大集合数据类型之字典
python中最常用的哈希表就是字典dictionary了。字典即key:value的键值对,键必须是唯一的并且为不可变数据类型如字符串和数字。值不必是唯一的并且可以取任何数据类型。常见的字典方法:创建dict.fromkeys(seq[, value]),最多两个参数,seq为键,value为一个默认值print(thisdict.fromkeys(("color","sex")))增直接赋值添加或使用dic.update({mydict})方法删清空dic.clear(
2021-03-16 17:10:02
199
原创 二叉树的七种遍历
(一)首先先说下解题中常遇到的二叉树种类:满二叉树完全二叉树二叉搜索树平衡二叉搜索树(AVL树)C++中map、set、multiset、multimap的底层实现都是平衡二叉搜索树(红黑树),所以map、set的增删操作时间复杂度是logn,注意unordered_map、unordered_set底层实现是哈希表。Python中map(二)然后再是二叉树的存储方式:链式存储顺序存储(三)最后来到本文的重点二叉树的遍历方式。深度优先遍历:前、中、后序
2021-03-09 10:15:00
392
1
转载 基本算法之堆排序
算法思想堆排序是一种选择排序。堆的定义堆的定义如下,n个关键字序列L[1…n]称为堆,当且仅当该序列满足:1) L(i) >= L(2i) 且L(i) >=L(2i+1) 或2) L(i) <= L(2i) 且L(i) <=L(2i+1) (1=< i <= ⌊n/2⌋ ,即向下取整)因此,堆是一棵顺序存储的完全二叉树。满足条件1)的堆称为大根堆,大根堆的最大元素存放在根节点。满足条件2)的堆称为小根堆,根节点是最小元素。堆排序堆排序的思路很简
2021-03-04 14:32:31
1447
2
转载 Python 直接赋值、浅拷贝和深度拷贝
直接赋值:其实就是对象的引用(别名)浅拷贝(copy):拷贝父对象,不会拷贝对象的内部的子对象。深拷贝(deepcopy): copy 模块的 deepcopy 方法,完全拷贝了父对象及其子对象。整理自:https://www.runoob.com/w3cnote/python-understanding-dict-copy-shallow-or-deep.html...
2021-03-04 14:03:14
122
1
原创 基本排序算法总结
选择排序:简单选择排序堆排序交换排序:冒泡排序快速排序插入排序:直接插入排序折半插入排序希尔排序其他归并排序基数排序下面我们通过时空复杂度、算法的稳定性、算法的过程特征三个角度出发进行上述排序算法的总结。 从时间复杂度来看,简单选择排序、直接插入排序和冒泡排序平均情况下的时间复杂度都为O(n2n^2n2),且实现过程也较简单。但直接插入排序和冒泡排序最好情况下的时间复杂度都可以达到O(nnn),而简单选择排序则与序列的初始状态无关。希尔排序作为插..
2021-03-02 22:41:49
188
原创 基本排序算法之归并排序
算法思想”归并“的含义是将两个或两个以上的有序表组合成一个新的有序表。假定待排序表含有n个记录,则可将其视为n个有序的子表,每个子表的长度为1,然后两两归并,得到[n/2][n/2][n/2]个长度为2或1的有序表;继续两两归并。。。如此重复,直到合并成一个长度为n的有序表为止,这样的排序方法称之为2路归并排序。实现算法分析...
2021-02-24 11:06:08
177
原创 基本排序算法之快速排序
目前为止的三种排序:直接插入排序、冒泡排序和简单选择排序都是o(n2n^2n2)的运行时间。虽然冒泡加入标志位优化和直接插入排序都可以在最好情况下为o(n2n^2n2),但是在最坏情况和平均情况下,性能还是o(n2n^2n2)。还有复杂度为o(nlogn)的更好算法,这些算法的秘诀就是分而治之的策略。本文介绍面试中一定盲写都要会写的快速排序。快速排序属于交换排序的一种。算法思想快排的基本思想是基于分治法的:在待排序表L[1…n]中任取一元素pivot作为基准(通常取首元素),通过一趟排序将待排序表划
2021-02-23 18:51:08
450
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人