高频算法题训练
文章平均质量分 55
主要来源于leetCode以及牛客网的高频算法题进行学习和训练
存在morning
乐于了解新技术,善于复盘总结,不是很聪明,但能够持续进步。
展开
-
【算法思维训练-剑指Offer联名 二】递归与循环篇
本篇是联名训练的第二篇,主题为递归与循环,如果我们需要重复地多次计算相同的问题,通常可以选择用递归或者循环两种不同的方法。递归是在一个函数的内部调用这个函数自身。而循环则是通过设置计算的初始值及终止条件,在一个范围内重复运算。递归与循环循环很常见,就是for、while、do while这样子,我们平时使用的也较为频繁,我们重点关注下递归的优缺点:优点:代码简洁。基于递归实现的代码比基于循环实现的代码要简洁很多,更加容易实现。缺点一:效率较低。递归由于是函数调用自身,而函数调用是有时间和空间的消耗原创 2020-05-17 17:35:21 · 589 阅读 · 0 评论 -
【基本数据结构 一】线性数据结构:数组
从今天开始通过算法训练来锻炼自己的逻辑思维,在上手阶段通过刷《剑指Offer》的一些题来找回手感,由于数据结构也有些遗忘,所以按照题型分类的角度来进行训练,每篇为一个主题,每周完成至少一个主题,挑战值三个主题,同时也能完善下自己数据结构的一些知识。每篇blog先基础总结下考点,然后训练相应的题,最后总结下收获。数据结构当然在训练之前回顾下基础知识,在Java版的数据结构中的【数据结构 一】数组一文中已经进行过详细的整理,这里只摘录一些基本要点:数组变量是引用类型,数组本身就是对象,数组中的每个元素相原创 2020-05-16 19:20:27 · 493 阅读 · 0 评论 -
【算法真题 一】满二叉搜索树求三个节点的最低公共祖先
题目描述对于一棵满二叉搜索树深度为K,节点数为2^k - 1,节点值为[1, 2^k - 1]。给出k和任意三个节点的值,输出包含该三个节点的最小子树的根节点值。输入: 4 10 15 13输出:12解题思路依据二叉搜索树的特殊性质和满二叉树的特殊性质,可用二分查找的方式代码实现package 腾讯;import java.util.Scanner;public class Main { pu原创 2017-08-30 16:21:27 · 1093 阅读 · 0 评论 -
【经典算法问题 一】海量数据中找出前k大数(topk问题)
转自:http://blog.csdn.NET/zyq522376829/article/details/47686867前两天面试3面学长问我的这个问题(想说TEG的3个面试学长都是好和蔼,希望能完成最后一面,各方面原因造成我无比想去鹅场的心已经按捺不住了),这个问题还是建立最小堆比较好一些。先拿10000个数建堆,然后一次添加剩余元素,如果大于堆顶的数(10000中最小的),将这个数替换堆顶,原创 2017-08-25 16:43:44 · 2704 阅读 · 0 评论 -
【经典算法问题 二】交换两个变量值,不使用第三个变量
昨天面试的时候问到了这个,回答了异或的方式,后来自己又想了一下,总结这么几种/** * */package test;import java.util.Stack;/** * <p> * Title:NoNeedThreeChange * </p> * <p> * Description: * </p> * * @author 田茂林 * @data 2017年8月25日原创 2017-08-25 09:20:36 · 560 阅读 · 0 评论 -
【经典算法问题 三】N个降序数组,找到最大的K个数
蘑菇街的一道电话面试真题。转载自http://blog.csdn.net/qianhen123/article/details/46544787题目描述假定有20个有序数组,每个数组有500个数字,降序排列,数字类型32位uint数值,现在需要取出这10000个数字中最大的500个。解题思路(1).建立大顶堆,维度为数组的个数,这里为20(第一次 插入的是每个数组中最大的值,即第一个元素)。 (2转载 2017-08-24 08:36:16 · 833 阅读 · 0 评论 -
剑指offer_字符串---左旋转字符串
题目描述汇编语言中有一种移位指令叫做循环左移(ROL),现在有个简单的任务,就是用字符串模拟这个指令的运算结果。对于一个给定的字符序列S,请你把其循环左移K位后的序列输出。例如,字符序列S=”abcXYZdef”,要求输出循环左移3位后的结果,即“XYZdefabc”。是不是很简单?OK,搞定它!代码实现public class Solution { public String LeftRo原创 2017-10-10 21:54:17 · 566 阅读 · 0 评论 -
剑指offer_字符串---字符串的排列
题目描述输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。输入描述: 输入一个字符串,长度不超过9(可能有字符重复),字符只包括大小写字母。代码实现import java.util.ArrayList;import java.util.TreeSet;public cla原创 2017-10-10 21:52:59 · 394 阅读 · 0 评论 -
剑指offer_递归与循环---扑克牌顺子
题目描述LL今天心情特别好,因为他去买了一副扑克牌,发现里面居然有2个大王,2个小王(一副牌原本是54张^_^)…他随机从中抽出了5张牌,想测测自己的手气,看看能不能抽到顺子,如果抽到的话,他决定去买体育彩票,嘿嘿!!“红心A,黑桃3,小王,大王,方片5”,“Oh My God!”不是顺子…..LL不高兴了,他想了想,决定大\小 王可以看成任何数字,并且A看作1,J为11,Q为12,K为13。上面的原创 2017-10-10 20:59:58 · 377 阅读 · 0 评论 -
剑指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]。不能使用除法。解题思路B[i]的值可以看作下图的矩阵中每行的乘积。下三角用连乘可以很容求得,上三角,从下向上也是连乘。因此我们的思路就很清晰了,先算下三角中的连乘,即我们先算出B[i]中的一部分,然后倒过来按上三角中的分布规律,把原创 2017-10-10 20:49:16 · 459 阅读 · 0 评论 -
剑指offer_数组---数组中只出现一次的数字
题目描述一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。解题思路首先我们考虑这个问题的一个简单版本:一个数组里除了一个数字之外,其他的数字都出现了两次。请写程序找出这个只出现一次的数字。这个题目的突破口在哪里?题目为什么要强调有一个数字出现一次,其他的出现两次?我们想到了异或运算的性质:任何一个数字异或它自己都等于0 。也就是说,如果我们从头到尾依次异或数原创 2017-10-10 20:42:11 · 340 阅读 · 0 评论 -
剑指offer_数组---数字在排序数组中出现的次数
题目描述统计一个数字在排序数组中出现的次数。解题思路二分法递归查找,一看到已排序就要想到二分代码/** * */package 数组;/** * <p> * Title:GetNumberOfK * </p> * <p> * Description: * </p> * * @author 田茂林 * @data 2017年8月8日 上午11:14:03 */publi原创 2017-10-10 20:31:19 · 344 阅读 · 0 评论 -
剑指offer_数组---数组中的逆序对
题目描述在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数P。并将P对1000000007取模的结果输出。 即输出P%1000000007/** * */package 数组;/** * <p> * Title:InversePairs * </p> * <p> * Description: * </p>原创 2017-10-10 20:28:18 · 364 阅读 · 0 评论 -
剑指offer_数组---把数组排成最小的数
题目描述输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323。解题思路1,把数字转换为字符串 2,定义新的字符串比较规则代码实现/** * */package 数组;import java.util.Arrays;import java.util.Comparator原创 2017-08-27 11:55:22 · 327 阅读 · 0 评论 -
剑指offer_数组---最小的K个数
题目描述输入n个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,。解题思路实际上考察的是对排序的理解。这里我用以下几种方法区做 1原创 2017-08-27 11:18:38 · 406 阅读 · 2 评论 -
剑指offer_数组---数组中重复的数字
题目描述在一个长度为n的数组里的所有数字都在0到n-1的范围内。 数组中某些数字是重复的,但不知道有几个数字是重复的。也不知道每个数字重复几次。请找出数组中任意一个重复的数字。 例如,如果输入长度为7的数组{2,3,1,0,2,5,3},那么对应的输出是第一个重复的数字2。解题思路1,用额外的空间来给数组里的数字打标签,当发现重复标签的时候说明找到了 2,将数组里的数字放到和自己值相同的索引处,如原创 2017-08-26 11:21:52 · 326 阅读 · 0 评论 -
剑指offer_发散思维---求1+2+3+...+n
题目描述求1+2+3+…+n,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)。解题思路用&&运算符,满足第一个条件才执行第二个条件和递归这两种结合来解题代码实现/** * */package 发散思维;/** * <p> * Title:Sum * </p> * <p> * Description: * </p>原创 2017-08-25 18:09:59 · 367 阅读 · 0 评论 -
剑指offer_数组---数组中出现次数超过一半的数
题目描述数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。如果不存在则输出0。解题思路1,第一种,超过一半的数必然出现在递增数组中间,先排序,然后统计中间值次数 2,第二种,遍历每一个数出现的次数,放到map里,然后用次数和len/2比较 3,第三种,利用数原创 2017-08-25 17:52:16 · 359 阅读 · 0 评论 -
剑指offer_数组---连续子数组的最大和
题目描述HZ偶尔会拿些专业问题来忽悠那些非计算机专业的同学。今天测试组开完会后,他又发话了:在古老的一维模式识别中,常常需要计算连续子向量的最大和,当向量全为正数的时候,问题很好解决。但是,如果向量中包含负数,是否应该包含某个负数,并期望旁边的正数会弥补它呢?例如:{6,-3,-2,7,-15,1,2,2},连续子向量的最大和为8(从第0个开始,到第3个为止)。你会不会被他忽悠住?(子向量的长度至少原创 2017-08-25 17:12:36 · 328 阅读 · 1 评论 -
剑指offer_数组---顺时针打印矩阵
题目描述输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下矩阵: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 则依次打印出数字1,2,3,4,8,12,16,15,14,13,9,5,6,7,11,10.解题思路1,首先判断一共可以打印几圈 2,每圈的四行打印的边界条件是什么代码实现/** * */package 数组;imp原创 2017-08-25 16:06:31 · 375 阅读 · 0 评论 -
剑指offer_发散思维---数值的整数次方
题目描述给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。解题思路主要涉及完整性考虑,首先按照正数次幂,负数次幂,0次幂,三种分析,底数为0和非0。 1,第一种方式,常规做法 2,第二种方式,用递归的方法,效率提高 3,第三种方式,用快速幂的方法,可以实现递归的效果代码实现/** * */package 发散思维;/** *原创 2017-08-25 11:15:48 · 333 阅读 · 0 评论 -
剑指offer_位运算---二进制中1的个数
题目描述输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。解题思路1,利用辅助数,1的位置变化的,来逐位求与 2,利用整数自身特性:举个例子:一个二进制数1100,从右边数起第三位是处于最右边的一个1。减去1后,第三位变成0,它后面的两位0变成了1,而前面的1保持不变,因此得到的结果是1011.我们发现减1的结果是把最右边的一个1开始的所有位都取反了。这个时候如果我们再把原来的整数和原创 2017-08-25 09:43:17 · 303 阅读 · 0 评论 -
剑指offer_数组---替换空格
题目描述请实现一个函数,将一个字符串中的空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。解题思路1,使用stringBuffer辅助解决 2,不使用辅助类,字符替换解决代码实现/** * */package 字符串;/** * <p> * Title:ReplaceSpace * </p> * <p> *原创 2017-08-23 20:49:12 · 332 阅读 · 0 评论 -
剑指offer_数组---调整数组顺序使奇数位于偶数前面
题目描述输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。解题思路1,暴力遍历法,取出所有奇数放到一个数组里,取出所有偶数放到一个数组里,然后把所有奇数和偶数先后放入原数组 2,插入法,时间复杂度也是o(n^2)但是不需要开辟额外空间代码实现package 数组;/** *原创 2017-08-23 17:46:56 · 293 阅读 · 0 评论 -
剑指offer_数组---旋转数组的最小数字
题目描述把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。 输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素。 例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。 NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。解题思路1,使用Arrays.sort 2,暴力遍历法 3,二分查找代码实现package 数组;import原创 2017-08-23 15:42:09 · 390 阅读 · 2 评论 -
剑指offer_数组---二维数组中的查找
题目描述在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。解题思路1,直接用hashset 2,用技巧方法,依据递增顺序这一特点代码实现package 数组;import java.util.HashSet;/** * * * 在一个二维数组中,每一行都按照从左到右递增的顺原创 2017-08-23 15:04:26 · 339 阅读 · 0 评论 -
剑指offer_递归与循环---矩形覆盖
题目描述我们可以用2*1的小矩形横着或者竖着去覆盖更大的矩形。请问用n个2*1的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法?解题思路依旧是斐波那契数列 2*n的大矩形,和n个2*1的小矩形 其中target*2为大矩阵的大小 有以下几种情形: 1⃣target <= 0 大矩形为<= 2*0,直接return 1; 2⃣️target = 1大矩形为2*1,只有一种摆放方法,r原创 2017-08-23 12:05:46 · 360 阅读 · 0 评论 -
剑指offer_递归与循环---变态跳台阶
题目描述一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。解题思路关于本题,前提是n个台阶会有一次n阶的跳法。分析如下: f(1) = 1 f(2) = f(2-1) + f(2-2) //f(2-2) 表示2阶一次跳2阶的次数。 f(3) = f(3-1) + f(3-2) + f(3-3) … f(n) =原创 2017-08-23 11:59:20 · 322 阅读 · 0 评论 -
剑指offer_递归与循环---跳台阶
题目描述一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法。解题思路1,用递归,将问题转换为f(n)=f(n-1)+f(n-2); 2,用迭代,原理类似代码实现/** * */package 递归和循环;/** * <p> * Title:JumpFloor * </p> * <p> * Description: * </p> * *原创 2017-08-23 11:43:56 · 378 阅读 · 0 评论 -
剑指offer_递归与循环---斐波那契数列
题目描述大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项。 n<=39解题思路1,斐波那契数列除了第一项和第二项是1,其余都为前两项的和 2,使用递归方式。代码实现/** * */package 递归和循环;/** * 第一个为1,第二个为2,第三项开始,为前两项的和 1,1,2,3,5,8 * * @author 田茂林 * @data 2017年原创 2017-08-23 11:18:32 · 389 阅读 · 0 评论 -
剑指offer_链表---删除链表中重复的结点
题目描述在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5解题思路1, 设置firstNode节点,防止1–1—1–1—1这种状况出现null指针 2,遇到连续的相同值,让pre指向最后一个相同值的下一个。 3,非相同值,指针顺序移位即可代码实现/** * */p原创 2017-08-23 10:44:43 · 311 阅读 · 0 评论 -
剑指offer_链表---链表中环的入口结点
题目描述一个链表中包含环,请找出该链表的环的入口结点。解题思路1,使用快慢指针找到碰撞点 2,两个同速指针分别从头节点和碰撞点出发,相遇的地方就是入口节点代码实现/** * */package 链表;/** * <p> * Title:EntryNodeOfLoop * </p> * <p> * Description: * </p> * * @author 田茂林 *原创 2017-08-23 10:07:10 · 326 阅读 · 0 评论 -
剑指offer_链表---两个链表的第一个公共结点
题目描述输入两个链表,找出它们的第一个公共结点。解题思路暴力解法:第一步,分别求出链表1和2的长度。 第二步,依据差距挪动指针。 第三步,寻找公共子节点优化解法:使用HashSet不可重复的性质,发现重复节点(值相同且next相同)即可返回。代码/** * */package 链表;import java.util.HashSet;import java.util.TreeSet;/*原创 2017-08-22 17:29:13 · 336 阅读 · 0 评论 -
剑指offer_链表---复杂链表的复制
题目描述输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head。(注意,输出结果中请不要返回参数中的节点引用,否则判题程序会直接返回空)解题思路第一步,原样复制,每一个复制的节点跟在原节点后边 第二步,确定复制节点的任意指向 第三步,拆分长链表为原链表和复制链表代码实现/** * */package 链原创 2017-08-22 16:45:27 · 343 阅读 · 0 评论 -
剑指offer_链表---合并两个排好序的链表
题目描述输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。解题思路1,如果list1和list2都不为空,那么比较大小插入新链表 2,其中一个为空以后,把剩下的一个直接挂到已排序列表后边代码实现/** * */package 链表;/** * <p> * Title:Merge * </p> * <p> * Description: *原创 2017-08-22 15:47:36 · 326 阅读 · 0 评论 -
剑指offer_链表---反转链表
题目描述输入一个链表,反转链表后,输出链表的所有元素。解题思路用一个临时指针存储原本应该的下一位代码实现/** * */package 链表;/** * <p> * Title:ReverseList * </p> * <p> * Description: * </p> * * @author 田茂林 * @data 2017年8月22日 下午3:02:54 */pu原创 2017-08-22 15:16:59 · 305 阅读 · 0 评论 -
剑指offer_链表---链表中倒数第k个结点
题目描述输入一个链表,输出该链表中倒数第k个结点。解题思路1,硬解,先求出链表总长度,然后倒数第k个就是正数第count-k+1个 2,软解,双指针,两个同时开始走,p指针先跑,并且记录节点数,当p指针跑了k-1个节点后,pre指针开始跑, 当p指针跑到最后时,pre所指指针就是倒数第k个节点,也就是说两个指针之间相差k-1,一个到最后,另一个刚好到k代码实现/** * */package原创 2017-08-22 15:01:13 · 298 阅读 · 0 评论 -
剑指offer_链表---从尾到头打印链表
题目描述输入一个链表,从尾到头打印链表每个节点的值。解题思路使用递归的方式,先向后走再添加值代码实现/** * */package 链表;import java.util.ArrayList;/** * <p> * Title:PrintListFromTailToHead * </p> * <p> * Description: * </p> * * @author 田茂林原创 2017-08-22 12:10:37 · 319 阅读 · 0 评论 -
剑指offer_栈和队列---栈的压入,弹出序列
题目描述输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。(注意:这两个序列的长度是相等的)解题思路1,按照顺序持续入栈,直到发现和出栈第一个元素相同的为止,弹出,接着判断 2,这时候就原创 2017-08-22 11:30:59 · 415 阅读 · 0 评论 -
剑指offer_栈和队列---包含min函数的栈
题目描述定义栈的数据结构,请在该类型中实现一个能够得到栈最小元素的min函数。解题思路1,两个栈,一个完成基本功能,一个充当辅助栈 2,辅助栈内最小值总是上浮到栈顶代码实现/** * */package 栈和队列;import java.util.Stack;/** * <p> * Title:MinStack * </p> * <p> * Description: * </p原创 2017-08-22 10:53:01 · 434 阅读 · 0 评论