- 博客(77)
- 收藏
- 关注
原创 剑指offer-- 对称的二叉树(Java)
题目 请实现一个函数,用来判断一棵二叉树是不是对称的。如果一棵二叉树和它的镜像一样,那么它是对称的。思路如果一个树的左子树与右子树镜像对称,那么这个树是对称的。因此,该问题可以转化为:两个树在什么情况下互为镜像?如果同时满足下面的条件,两个树互为镜像:它们的两个根结点具有相同的值。 每个树的右子树都与另一个树的左子树镜像对称。实现 boole...
2019-08-01 11:13:25 276 1
转载 多数投票算法(Boyer-Moore Algorithm)
多数投票算法(Boyer-Moore Algorithm)详解写在前面:在刷LeetCode 169 时碰到了这个问题,并且在评论区找到了这个方法,不过发现CSDN上对其进行解读的博客大多停留在知其然而不知其所以然的层面,所以准备在此做一个较为详细的解读,重点在于介绍其原理。问题描述给定一个无序数组,有n个元素,找出其中的一个多数元素,多数元素出现的次数大于⌊ n/2 ⌋,注意数组...
2019-07-19 21:40:15 567
原创 [LeetCode]1. Two Sum 两数之和
题目: 给定一个整数数组 nums和一个目标值 target,请你在该数组中找出和为目标值的那两个整数,并返回他们的数组下标。 你可以假设每种输入只会对应一个答案。示例:给定 nums = [2, 7, 11, 15], target = 9因为 nums[0] + nums[1] = 2 + 7 = 9所以返回 [0, 1]思路:方法一:暴力法 暴力法很简...
2019-07-10 10:30:56 209
原创 二进制位运算的几个用法
位运算的常见用法下面举的例子中,a=1010 1010按位与&(1)清零:a&0=0(2)取指定位上的数字,如取得数字a的最后四位:a&0000 1111 = 0000 1010按位或|(1)对某些位置置为1,如将a的后四位置为1:a|0000 1111 = 1010 1111异或^(1)将某些位置取反,如将a的后四位取反:a^0000 11...
2019-07-09 11:15:15 240
原创 剑指offer-- 构建乘积数组
题目 给定一个数组A[0, 1, …, n-1],请构建一个数组B[0, 1, …, n-1],其中B中的元素B[i] =A[0]×A[1]×… ×A[i-1]×A[i+1]×…×A[n-1]。不能使用除法。思路 无法使用除法,正常连乘的话时间复杂度为O(n^2),效率非常低。 考虑到计算每个B[i]时都会有重复,思考B[i]之间的联系,找出规律,提高效率。 如上图...
2019-07-09 10:35:22 143
原创 剑指offer-- 旋转数组的最小数字(Java)
题目 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。 输入一个非减排序的数组的一个旋转,输出旋转数组的最小元素。 例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。 NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。思路 数组在旋转之后,分为两部分有序的数组,最小的数处在两个有序数组的边界上,由于数组在一定程度上是有...
2019-07-08 13:37:17 191
原创 常见数据结构的查找、插入、删除时间复杂度
访问 查找 插入 删除 数组 O(1) O(n) O(n) O(n) 有序数组 O(1) O(logn) O(n) O(n) 链表 O(n) O(n) O(1) O(1) 有序链表 O(n) O(n) O(n) O(n) 二叉树查找树 O(logn)...
2019-07-04 15:49:51 5886 2
原创 树:
二叉查找树(又:二叉搜索树,二叉排序树)它或者是一棵空树,或者是具有下列性质的二叉树: 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值; 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值; 它的左、右子树也分别为二叉排序树。二叉查找树和堆的区别1、结构上:二叉排序树:左子树小于根节点,根节点又小于右子树。堆(大堆):根节点大于左右子树,但是左右子树没有大小...
2019-07-03 10:53:16 126
原创 剑指offer--替换空格
题目 请实现一个函数,把字符串中的每个空格替换成"%20"。例如输入“We are happy.”,则输出“We%20are%20happy.”。思路 首先要询问面试官是新建一个字符串还是在原有的字符串上修改,本题要求在原有字符串上进行修改。 若从前往后依次替换,在每次遇到空格字符时,都需要移动后面O(n)个字符,对于含有O(n)个空格字符的字符串而言,总的时间效率为O(n2...
2019-06-22 16:36:55 112
原创 剑指offer-- 第一个只出现一次的字符
题目 在字符串中找出第一个只出现一次的字符。如输入"abaccdeff",则输出'b'。思路 创建哈希表,键值key为字符,值value为出现次数。第一遍扫描:对每个扫描到的字符的次数加一;第二遍扫描:对每个扫描到的字符通过哈希表查询次数,第一个次数为1的字符即为符合要求的输出。 可以使用java中的hashmap,但本题只需要用一个简单的数组即可,由于字符(char)是长...
2019-06-21 11:12:37 136
原创 栈和队列总结
栈 队列 特点 后进先出 先进先出 定义 Stack<Object> stack = new Stack<Object>() Queue<Object> queue = new LinkedList<Object>() 入 s.push() q.offer() 出 s.pop(...
2019-06-06 09:53:43 536
原创 剑指offer--不用加减乘除做加法
题目 写一个函数,求两个整数之和,要求在函数体内不得使用+、-、×、÷四则运算符号。思路 无论是做十进制的加法,还是二进制的加法,都可以用三步走的策略:(1)只做各位相加不进位(2)计算进位(3)把上述结果相加。因此采用二进制的位运算实现三步走的加法运算 1)不考虑进位对每一位相加:1加0,0加1都等于1,而0加0,1加1等于0,所以使用异或^操作; 2)计算...
2019-05-23 10:39:16 98
原创 剑指offer-- 求1+2+…+n
题目 求1+2+…+n,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)。思路 不能使用乘除法,不能使用循环语句、判断语句。可以考虑的有 单目运算符:++和--,双目运算符:+,-,移位运算符<<和>>,关系运算符>,<等,逻辑运算符&&,||,&,|,...
2019-05-22 11:23:42 131
原创 GAN
GAN :基于概率的生成模型什么是 GAN?用 Ian Goodfellow 自己的话来说:“生成对抗网络是一种生成模型(Generative Model),其背后基本思想是从训练库里获取很多训练样本,从而学习这些训练案例生成的概率分布。”而实现的方法,是让两个网络相互竞争,‘玩一个游戏’。其中一个叫做生成器网络( Generator Network),它不断捕捉训练库里真实图片的概率分布...
2019-05-12 14:12:30 256
转载 机器学习中“判定模型”和“生成模型”的区别?
机器学习的任务是从属性X预测标记Y,即求概率P(Y|X);对于判别式模型来说求得P(Y|X),对未见示例X,根据P(Y|X)可以求得标记Y,即可以直接判别出来,如上图的左边所示,实际是就是直接得到了判别边界,所以传统的、耳熟能详的机器学习算法如线性回归模型、支持向量机SVM等都是判别式模型,这些模型的特点都是输入属性X可以直接得到Y(对于二分类任务来说,实际得到一个score,当score...
2019-05-10 20:34:40 274
原创 Java中equals和==的区别
java中的数据类型,可分为两类:1.基本数据类型,也称原始数据类型。byte,short,char,int,long,float,double,boolean 对于基本类型来说,他们存储在jvm的栈中,他们之间的比较,应用双等号(==),比较的是变量的内容,也就是比较的变量的值。2.引用数据类型,包括类,数组,接口 对于引用类型来说,因为对象内容存储在jvm的堆中,...
2019-03-20 12:09:43 110
原创 [LeetCode]125. Valid Palindrome 验证回文字符串
Given a string, determine if it is a palindrome, considering only alphanumeric characters and ignoring cases.Note:For the purpose of this problem, we define empty string as valid palindrome.Examp...
2019-03-14 22:35:16 136
原创 java内存模型
Java的内存模型图:第一、程序计数器(PC) 程序计数器(Program Counter Register)是一块较小的内存空间,它可以看做当前线程所执行的字节码的行号指示器,字节码解释器工作时就是通过改变这个计数器的值来取下一条需要执行的字节码指令,分支、跳转、循环、异常处理、线程恢复等基础功能都需要这个计数器来完成。 若线程正在执行的是java方法,PC存储的是的当前线程...
2019-03-09 20:26:35 131
原创 剑指offer-- 找出数组中重复的数字(Java)
题目: 在一个长度为n的数组里的所有数字都在0到n-1的范围内。数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。例如,如果输入长度为7的数组{2, 3, 1, 0, 2, 5, 3},那么对应的输出是重复的数字2或者3。思路: 从哈希表的思路拓展,重排数组:把扫描的每个数字(如数字m)放到其对应下标(m下标)的位置上,若...
2019-03-08 14:59:53 749
原创 剑指offer-- 丑数(Java)
题目:我们把只包含因子2、3和5的数称作丑数(Ugly Number)。求按从小到大的顺序的第1500个丑数。例如6、8都是丑数,但14不是,因为它包含因子7。习惯上我们把1当做第一个丑数。思路: 直观思路:从1开始逐一判断每个整数是否为丑数,直到找到第n个丑数,时间效率太低。因为对于每一个整数都要计算,即使一个整数不是丑数,也要进行除法和取余操作。 空间换时间的解法: 创建数组存...
2019-03-04 11:27:23 159
原创 剑指offer-- 删除链表中重复的结点(Java)
题目:在一个排序的链表中,如何删除重复的结点?思路: 设置一个preNode,用于记录当前结点的前一个结点,如果当前结点和后一结点的值相同(记该值为dupVal),通过循环往后找到第一个不为dupVal的结点,把该结点设置为当前结点,并赋值给preNode.next,即相当于完成了删除操作;而当前结点和后一结点的值不相同时,把当前结点和preNode往后移一位即可。 实现:...
2019-03-03 15:45:28 201
原创 剑指offer-- 链表中环的入口结点(Java)
题目:一个链表中包含环,如何找出环的入口结点?思路: 1.确定链表是否有环:通过两个不同速度的指针确定,当两个指针指向同一个结点时,该链表含有环,并且相遇点在环内。 2.确定环中结点的数目n:指针走一圈,边走边计数 3.找到环的入口:从头结点开始,通过两个相差为n的指针来得到(快指针先走n部,然后快慢指针的相遇点就是环入口节点)考点:代码的鲁棒性实现: public...
2019-03-02 21:03:48 269
原创 剑指offer--在O(1)时间删除链表结点(Java)
题目:给定单向链表的头指针和一个结点指针,定义一个函数在O(1)时间删除该结点。思路: 通常那样从头开始查找删除需要的时间为O(n) 要在O(1)时间删除某结点,可以这样实现:设待删除结点i的下一个结点为j,把j的值复制到i,再把i的指针指向j的下一个结点,最后删除j,效果就相当于删除j。 注意特殊情况:1.当待删除结点i为尾结点时,无下一个结点,则只能从头到尾顺序遍历;2....
2019-03-01 10:39:03 358
原创 剑指offer--两个链表的第一个公共结点(Java)
题目:输入两个链表,找出它们的第一个公共结点。思路:蛮力法:遍历第一个链表的结点,每到一个结点,就在第二个链表上遍历每个结点,判断是否相等。时间复杂度为O(m*n),效率低,注意新一轮循环要将链表指向头部; 使用栈:由于公共结点出现在尾部,所以用两个栈分别放入两个链表中的结点,从尾结点开始出栈比较。时间复杂度O(m+n),空间复杂度O(m+n)。 利用长度关系:计算两个链表的长度之差,长链...
2019-02-28 23:02:16 218
原创 剑指offer--包含min函数的栈(Java)
题目: 定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的min函数。在该栈中,调用min、push及pop的时间复杂度都是O(1)。思路: 要定义一个变量存储min值,每次push进一个新的值,随之改变min的值,但是当最小元素弹出时,min变量无法捕捉之前的值,因此定义一个辅助栈来存放最小元素,把每次的最小值都存储下来 栈 3,4,2,5,1 辅助栈 3,...
2019-02-26 21:54:52 163
原创 剑指offer--用两个栈实现队列(Java)
题目:用两个栈实现一个队列。完成在队列尾部插入结点和在队列头部删除结点的功能。思路: 试着模拟一下插入删除的过程(在草稿纸上动手画一下):插入肯定是往一个栈stack1中一直插入;删除时,直接出栈无法实现队列的先进先出规则,这时需要将stack1中的所又元素出栈,压到另一个栈stack2中,然后再从stack2中出栈就OK了。需要稍微注意的是:当stack2中还有元素,stack1中的元素不...
2019-02-26 21:16:38 211
原创 剑指offer--二叉搜索树的后序遍历序列(Java)
题目:输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则返回true,否则返回false。假设输入的数组的任意两个数字都互不相同。思路:二叉树后序遍历数组的最后一个数为根结点,剩余数字中,小于根结点的数字(即左子树部分)都排在前面,大于根结点的数字(即右子树部分)都排在后面。根据遍历数组的这个特性,可以编写出一个递归函数,用于实现题目所要求的判断功能。考点:举例让抽象问题...
2019-02-26 18:23:18 218
原创 剑指offer--二叉搜索树的第k大结点(Java)
题目: 给定一棵二叉搜索树,请找出其中的第k小的结点。思路: 二叉查找树的中序遍历结果是节点的从小到大排序序列 设置全局变量index=0,对BST进行中序遍历,每遍历一个结点,index+1,当index=k时,该结点即为所求结点。考点:知识迁移能力实现:int index=0; TreeNode KthNode(TreeNode pRoot...
2019-02-26 16:08:03 403
原创 剑指offer--二叉树的下一个结点(Java)
题目:给定一棵二叉树和其中的一个结点,如何找出中序遍历顺序的下一个结点? 树中的结点除了有两个分别指向左右子结点的指针以外,还有一个指向父结点的指针。思路: 首先自己在草稿纸上画图,进行分析(不再展开)。可以发现下一个结点的规律为: 1.若当前结点有右子树时,其下一个结点为右子树中最左子结点; 2.若当前结点无右子树时, (1)若当前结点为其父结点的左子结点时,其下一个结点为其...
2019-02-26 14:37:26 147
原创 剑指offer--反转链表(Java)
题目:定义一个函数,输入一个链表的头结点,反转该链表并输出反转后链表的头结点。思路: 方法一:使用三个指针(l,cur,r)进行实现(cur为当前遍历到的节点,l为cur的前一个节点,r为cur的后一个节点)。令cur指向l,r则是用于防止链表断裂 注:当前节点从head开始 方法二(递归):找到最后一个结点作为返回值,递归函数中,找到最后的头结点后,开始进行每个结点next...
2019-02-26 10:54:18 169
原创 剑指offer---从上往下打印二叉树(Java)
题目:(一)从上往下打印出二叉树的每个结点,同一层的结点按照从左到右的顺序打印。(二)从上到下按层打印二叉树,同一层的结点按从左到右的顺序打印,每一层打印到一行。(三)请实现一个函数按照之字形顺序打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右到左的顺序打印,第三行再按照从左到右的顺序打印,其他行以此类推。考点:举例让抽象问题具体化,树的遍历思路:(一)不分行从上...
2019-02-26 10:09:53 183
原创 剑指offer--链表中倒数第k个结点(Java)
题目:输入一个链表,输出该链表中倒数第k个结点。为了符合大多数人的习惯,本题从1开始计数,即链表的尾结点是倒数第1个结点。例如一个链表有6个结点,从头结点开始它们的值依次是1、2、3、4、5、6。这个链表的倒数第3个结点是值为4的结点思路:第一直觉是先从头开始遍历,计算链表个数n,然后重新遍历,第n-k+1个结点即为所需要的结点。但是需要遍历2次。也可以使用栈来解决。书中的方法则是:设置两个指...
2019-02-25 21:20:28 178
原创 常用排序算法总结
前言:一般在面试中最常考的是快速排序和归并排序,并且经常有面试官要求现场写出这两种排序的代码。对这两种排序的代码一定要信手拈来才行。还有插入排序、冒泡排序、堆排序等。面试官对于这些排序可能会要求比较各自的优劣、各种算法的思想及其使用场景。还有要会分析算法的时间和空间复杂度。常见的排序算法有8种:排序方法 时间复杂度(平均) 时间复杂度(最坏) 时间复杂度(最好) ...
2019-02-22 15:15:08 177
原创 时间复杂度&空间复杂度
一、时间复杂度:实际是指程序运行次数,而不是程序运行时间1.我们一般讨论的是最坏时间复杂度,这样做的原因是:最坏情况下的时间复杂度是算法在任何输入实例上运行时间的上限,以最坏代表最全。2.时间复杂度的书写规则:①忽略常数项,用O(1)表示 ②选取最坏时间复杂度即选取增长最快的项 ③递归的时间复杂度=递归总次数 * 每次递归中基本操作所执行的次数例1,代码如下:...
2019-02-21 15:54:47 317
原创 查找
二分查找:二分查找是一个基础的算法,也是面试中常考的一个知识点。二分查找就是将查找的键和数组的中间键作比较,如果被查找的键小于中间键,就在左子数组继续查找;如果大于中间键,就在右子数组中查找,否则中间键就是要找的元素。如果面试题要求在排序的数组(或者部分排序的数组)中查找数字或者统计某个数字出现的次数,都可以尝试使用二分查找实现(非递归):/** * 二分查找,找到该值在数组中...
2019-02-20 22:45:57 108
原创 剑指offer--数组中只出现一次的两个数字(Java)
题目:一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。要求时间复杂度是O(n),空间复杂度是O(1)。思路:记住:两个相同的数字异或等于0. 如果数组中只有一个数字只出现一次,我们从头到尾异或每个数字,那么最终的结果刚好是那个只出现一次的数字。 而本题里数组中有两个数字只出现一次,如果能够将数组分为两部分,两部分中都只有一个数字只出现一次,...
2019-02-20 15:42:59 605
原创 剑指offer算法部分
递归和循环:递归:定义:在一个函数的内部调用这个函数自身 优点:代码简洁 缺点:1.函数调用有时间和空间的开销,空间上:在内存栈中分配空间以保存参数,返回地址以及临时变量;时间上:数据的弾入和弹出都需要时间 2.递归中可能很多计算都是重复的(递归的本质是把一个问题分解成两个或多个问题),小问题存在相互...
2019-02-20 11:47:51 108
原创 剑指offer--斐波那契数列及青蛙跳台阶问题(Java)
题目:写一个函数,输入n,求斐波那契(Fibonacci)数列的第n项。思路:如果直接写递归函数,由于会出现很多重复计算,效率非常底,不采用。public int Fibonacci1(int n) { if (n <= 0) return 0; if (n == 1) return 1; return Fibonacci1(n-...
2019-02-19 21:12:09 306
原创 剑指offer---和为S的连续正数序列(Java)
题目:输入一个正数s,打印出所有和为s的连续正数序列(至少含有两个数)。例如输入15,由于1+2+3+4+5=4+5+6=7+8=15,所以结果打印出3个连续序列1~5、4~6和7~8。思路: 指针法: 用两个指针small和big分别代表序列的最大值和最小值。令small从1开始,big从2开始。 当从small到big的序列的和小于s时,增加big,使序列包含更多数字;(记得更...
2019-02-19 16:50:22 149
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人