算法
文章平均质量分 75
哈乐笑
北大信科11级本科生,15级硕士生
展开
-
一道递归/动规易错题的总结
这两天做leetcode发现自己对一个递归/动规的问题容易想错,特此来总结一下总共3道题一个是前几天碰见的面试题,给定一个二叉树还有一个给定的数值,让找到这课二叉树是否有一条路径上的值的和刚好等于给定的值(这里的路径只能从父节点到子节点)Leetcode 1367 这道题是相当于上面的变体,给定一个二叉树还有一个链表,判断二叉树上是否有一条路径刚好等于链表上的那条路径。第三题也是le...原创 2020-03-03 19:29:54 · 295 阅读 · 0 评论 -
【算法】按位Bit By Bit的方法
这几天零星做到了一些跟正整数位有关的操作的题目,就常见的就是异或,都需要O(n)O(n) 的时间复杂度。所以把这些题目总结一下。477. Total Hamming Distance 数字二进制的Hamming距离为,两个数字异或之后数中1的个数。所以让求出,一个数组中,所有数两两之间Hamming距离的和。421. Maximum XOR of Two Numbers in an Array原创 2017-02-03 02:05:33 · 1940 阅读 · 0 评论 -
最大子串和问题及其变形
今天英文面试的时候碰见的题目,倒是不难,就是稍微变形之后,一时没想起来。n天股票价格的信息,只能买卖一次,问什么时候买卖利润最大。这道题真的是太过经典了,但是面试的时候虽然答出来了,但是解释的不是很好,一方面是因为英文面试所以不是很擅长表述,另外一方面解释的不够有逻辑性,认为面试官很多都知道的。可以如下解释:这道题给形式化之后相当于找出一个i,j(i< j)使得nums[j]-nums[i]值最原创 2017-03-30 19:05:30 · 485 阅读 · 0 评论 -
【算法】矩阵的快速幂以及利用快速幂去解题
易老师购买了一盒饼干,盒子中一共有k块饼干,但是数字k有些数位变得模糊了,看不清楚数字具体是多少了。易老师需要你帮忙把这k块饼干平分给n个小朋友,易老师保证这盒饼干能平分给n个小朋友。现在你需要计算出k有多少种可能的数值 输入描述: 输入包括两行:第一行为盒子上的数值k,模糊的数位用X表示,长度小于18(可能有多个模糊的数位)第二行为小朋友的人数n输出描述: 输出k可能的数值种原创 2017-03-27 10:57:36 · 2159 阅读 · 0 评论 -
二分查找的坑点与总结
二分查找足够简单,但是坑点也有不少,下面来总结一下以下是二分查找的标准写法 以下这个函数是二分查找nums中[left,right)部分,right值取不到,如果查到的话,返回所在地,如果查不到则返回最后一个小于target值得后一个位置。//右值点不能取到的情况 int binary_search(vector<int>& nums,int left,int right, int ta原创 2016-12-09 17:09:28 · 5021 阅读 · 0 评论 -
【算法】Trie数(前缀树/字典树)简介及Leetcode上关于前缀树的题
前几天同学面今日头条被问到了Trie树,刚好我也对于Trie树这种数据结构不是很熟悉,所以研究了一下前缀树,然后把Leetcode上关于前缀树的题都给做了一遍。Leetcode上关于前缀树的题有如下:208. Implement Trie (Prefix Tree)这道题是实现一个前缀树,作为基础题啦Add and Search Word - Data structure design这道题是原创 2017-04-04 22:29:47 · 7979 阅读 · 0 评论 -
堆,赢者树,败者树的区别与联系
今天做LeetCode的23. Merge k Sorted Lists这道题的时候,遇到的这个问题。这道题本质上就是一个多路归并的问题,而这道题主要就是考察多路归并时候的选择问题。按照之前本科上课学的,最好的办法就是用竞赛树(败者树),可是我嫌麻烦就用堆来做了,也顺利能过。所以就想到,堆,赢者树,败者树到底有什么区别呢? 于是找了一些资料看了一下,在这里总结一下 首先它们三个的相同点就是在于原创 2016-12-06 16:13:50 · 10813 阅读 · 9 评论 -
【算法】O(1)空间,不改变原数组的情况下找第K大的数
找到无序数组中第K大的数,这道题蜜汁经典,腾讯和头条的面试中都被问到了,我一般用的都是大小为K的小顶堆和快排扫一半这两种思路做这道题,直到前几天面试头条的时候,终面面试官问,有没有O(1)O(1)空间【严格的O(1)O(1)空间,即不能用递归】且不改变原数组的情况下,找第K大的数。当场没有想起来,下来之后突然就想到了。所以特此来总结一下。找数组第K大的数 ,Leetcode上有一道原题: 215原创 2017-04-15 16:35:48 · 2793 阅读 · 1 评论 -
【算法】A*算法与启发函数
写这篇是因为看到国外一篇讲的巨好的关于A*算法的文章——Introduction to A*。图文并茂,而且讲了一些A*算法的来龙去脉,有些观点也醍醐灌顶啊,所以赶紧来总结一下。A*算法为什么叫这个名这个从wiki上看来的,一开始是57年提出的Dijkstra算法,然后64年Nils Nilsson提出了A1算法,是一个启发式搜索算法,而后又被改进成为A2算法,直到68年,被Peter E. Ha原创 2017-04-20 22:22:42 · 15040 阅读 · 2 评论 -
【算法】2SUM/3SUM/4SUM问题
之前就总结过一些Leetcode上各种sum问题,今天再拿出来完整得总结一番。 nSUM问题是指,在一个数组中,找出n个数相加和等于给定的数,这个叫做nSUM问题。 常见的有2SUM,3SUM,4SUM问题,还有各种SUM问题的变种. Leetcode上SUM问题包括: 1. 2SUM 15. 3Sum 16. 3Sum Closest 18.原创 2017-04-26 01:21:50 · 23877 阅读 · 1 评论 -
【算法】LeetCode上一些经典好题(update@0205)
LeetCode从15年末也就是大四的时候开始陆陆续续的刷了150多道题,今年因为马上要找工作了,所以又开始刷起来,觉得有必要记录一下做一些题目时的想法,和记录下一些好的题目和discuss里好的方法1.巧妙利用排序的比较函数179. Largest Number 这道题说给几个数,然后将这几个拼接在一起,使得拼接出来的数最大。 其实就是一个排序,但是一开始我写比较函数的时候想当然的以为按照第一原创 2016-12-06 15:26:31 · 17652 阅读 · 1 评论 -
【数学】用信息论去解决「小白鼠试毒」问题
试毒问题非常经典,最早是在本科时候人人上看到的,是最基础的1000个试剂,有一个是有毒的,一点就会死去,而且一个小白鼠只能试一次,问最少几个小白鼠能够找出哪瓶是有毒的。后来陆陆续续又看到了一些关于这方面的题,发现这个本质上相当于信息论中关于信息编码长度的问题。通用方法是讲试剂中哪瓶是毒品的信息总数表示出来为N,然后再找出小白鼠所能表示的状态数目为M,则需要的小白鼠个数为:K=logNMK =log原创 2017-06-02 12:49:49 · 8065 阅读 · 0 评论 -
【算法】滑动窗方法问题总结
陆陆续续更了LeetCode的好题总结原帖也已经记了好多的篇幅了,打算另起一篇。1.滑动窗在数组和字符串题中的应用424. Longest Repeating Character Replacement 这道题是说,给定一个字符串,和数字K,问改变K个字母,使得字符串中有最长的一串完全相同的子串,返回子串的长度。 Input: s = “ABAB”, k = 2 Output: 4原创 2017-01-30 02:09:32 · 13263 阅读 · 3 评论 -
【算法】逆序对问题的四种解法(归并排序,BST,树状数组,线段树)及变形
引发我对逆序对这个问题思考的源自这道题:315. Count of Smaller Numbers After Self以前我以为求一个序列逆序对个数的解法就是归并排序的改版原创 2017-02-12 17:18:21 · 5997 阅读 · 0 评论 -
【算法】上一篇的续:一些计算机操作的二进制总结
这篇是为了下一篇树状数组做提前预备知识的。一个数的相反数等于其反加1-x = (~x)+1;取一个数末尾的1有两种取法:x&(-x);x&(x^(x-1));扣除掉一个数最后面的那个1:x&(x-1);原创 2017-02-12 18:32:40 · 531 阅读 · 0 评论 -
【算法】组中元素全是1~n之间的整数问题
数组中数全是1~n的范围内的题 这部分之前是在LeetCode的好题总结里的,不过在打算给类似问题专题化之后,就单独把这部分拿了来了,然后又新加了一些总结和解法。长度为n的数组,其中元素全部为1~n,则这种题有一个通用的解法: 循环替换 num[num[i]] = num[i]直到不能替换为止。然后再继续。具体操作上,可以不断的做swap(num[i],num[num[i]])这样写起来代码原创 2017-01-31 20:23:32 · 1438 阅读 · 0 评论 -
Hinton的NNML课的学习笔记
如何在神经网络中加入先验知识:就是通过设计网络结构来加入网络的连接性权重进行约束激活函数的选择 也可以通过先验,来加入一些人工造的数据Hofman 93年的炼钢炉模型Mcnemar检测Dropout用来阻止同一层网络之间的合作作用,这些合作作用在拟合的时候是非常有效的,但是会有可能过拟合,如果用来测试的话,就会发现效果不是那么好slashing across a ravine山涧跳,学习速原创 2017-01-11 10:46:35 · 1748 阅读 · 0 评论 -
udacity上Google的深度学习笔记
L1从机器学习到深度学习为什么最近几年深度学习/神经网络开始火了:更便宜的GPU更大规模的数据分类问题是很多问题的基础:检测问题排序回归强化学习地方原创 2017-01-11 10:45:47 · 1884 阅读 · 0 评论 -
快速排序程序及易错点总结
void quicksort(vector<int> &nums, int left, int right){ //一定不要忘了,递归算法,一开始一定是判断退出条件 if (left >= right) return; int q = nums[right]; int i = left, j = right; while (i < j){原创 2017-02-09 21:07:23 · 1397 阅读 · 0 评论 -
【数学】一个奇技淫巧:如果用一枚硬币生成任意概率——比如1/π?
刚才舍友拿Matrix67博客里的一个问题来考我——如果用一枚硬币产生1/π的概率,没想出来怎么做,看了下解答感觉非常简单而且巧妙。 Matrix67原博客里的文章——26 个比较概率大小的问题,这个问题是其中第15个问题的一小部分原创 2017-03-22 00:55:12 · 6466 阅读 · 1 评论 -
从矩阵乘法的不同计算方式来看局部性原理
今天碰到的关于矩阵乘法不同情况下运算速度的问题,隐约记得是因为缓存的问题,后来突然想起来CSAPP那本书上讲过这个东西的,就是通过矩阵乘法三重循环的不同顺序来讲的局部性原理的,所以翻过来又看了一下。两个矩阵A,B相乘得到C【为了方便起见,把它们都看成n*n的方阵】经典的做法就是用三重循环来实现,但是具体这三重循环如何进行排列,就非常的有讲究。 假设n是一个非常大的数,也就意味着如果跨行的话,必然原创 2017-03-28 20:38:19 · 2781 阅读 · 1 评论 -
【数学】时间复杂度O(1)的离散采样算法—— Alias method/别名采样方法
因为需要用到Alias Sampling Method的方法,但是查了一下,发现没有找到靠谱的关于Alias Method的中文介绍,所以干脆自己写一个好了。 关于Alias Method的介绍的比较好的是一个外国Blog:Darts, Dice, and Coins: Sampling from a Discrete Distribution,以下的介绍也主要参考这篇Blog里的算法。原创 2017-03-24 09:52:40 · 30691 阅读 · 10 评论 -
【算法】子数组和的问题总结
这两周LeetCode的周周赛都有一道解法类似的题目: 525. Contiguous Array 这道题是有一个数组全是0,1两种数字,然后找出其中最长的一段子数组,子数组中0和1的数量相等。 523. Continuous Subarray Sum 这道题是判断一个数组,其是否存在一个子数组和,子数组和为选定值k的倍数其实子数组和的问题,知道标准解法之后,还是挺简单原创 2017-02-27 19:18:57 · 1904 阅读 · 0 评论 -
【算法】计算机图形学的一些经典小题:判断点在多边形内,随机生成三角形内的点,判断两个矩形是否相交等
前几天面试的时候被问到了,如何随机在三角形内生成点,我按照我的想法回答了一遍,但觉得回答的不够好。最后面试官说了一个最优的方法。觉得不错,顺带总结一下最近看到的一些关于计算机图形学方面的经典小题,知乎上看到的还有Leetcode上的1.判断一个点是否在多边形内首先先说一下输入的内容,多边形的顶点是一个数组输入进来,其中每个相邻点之间对应着多边形上有边相连POINT p1 = ptPolygon[i原创 2017-03-21 10:54:57 · 8429 阅读 · 3 评论 -
【算法】字符串匹配问题
28. Implement strStr()KMP算法KMP算法我觉得KMP算法的Next数组详解这篇文章讲的还是非常的透彻的。vector<int> next;void getnext(const string &needle){ next[0] = -1; int i = 0,k = -1; //还要注意这个地方,不要漏了后面那个-1 while(i<needl原创 2017-02-14 03:59:58 · 451 阅读 · 0 评论 -
【算法】线段树与树状数组
LeeCode上线段树的题目有如下: 218. The Skyline Problem 307. Range Sum Query - Mutable 308. Range Sum Query 2D- Mutable原创 2017-02-13 22:32:47 · 470 阅读 · 0 评论 -
【算法】卡特兰数问题(BST排列个数,矩阵乘法,算数加括号,排队等)
卡特兰数当年大二时候就知道了其在行走路线问题上面的应用,后来发现其还有更多的应用场景,而且最近做LeetCode也碰见了不少这样的问题,特此总结一番。 本篇未完,待续96. Unique Binary Search Trees 95. Unique Binary Search Trees II 这两道题题干差不多,就是1~n总共n个数,将其构建成一个BST数,问总共有多少种不同的构建方法原创 2017-02-11 02:19:45 · 3422 阅读 · 0 评论 -
【算法】二叉树的非递归遍历的简洁写法/迭代器实现/O(1)空间复杂度的Morris遍历
事情的起因是这样的,一大早突然想到C++的STL里set是由红黑树实现的,那set遍历的时候iterator是怎么实现的呢,自己想了个不算太好的算法,于是就想着去网上找找,看到一个人说就是把二叉树的非递归遍历给改改就好了,于是我就想着LeetCode上有前中后序二叉树的非递归遍历这三道题,之前做过,现在再拿来做一遍好了。但是发现我的做法跟网上主流的做法都不一样,但是感觉我自己的做法更好理解一点,于是原创 2017-02-08 23:55:12 · 2207 阅读 · 0 评论