算法
文章平均质量分 62
禄的光线
干吧!没啥说的。
展开
-
算法学习之树中两个节点的最低公共祖先
题目:输入两个树节点,求它们的最低公共祖先。普通的树:1、我们使用两个LinkedList依次记录从根节点到两个给定节点的路径2、得到路径后,我们对两个路径进行比较,最后一个相等的节点即为所求(添加与取得顺序相反,所以最后一个为最低公共节点) public TreeNode getLastCommonParent(TreeNode root, TreeNode p1, Tr...原创 2019-12-30 15:49:28 · 176 阅读 · 0 评论 -
算法学习之股票的最大利润
题目:假设把某股票的价格按照时间先后顺序存储在数组中,请问买卖该股票一次可能获得的最大利润是多少?例如,一只股票在某些时间节点的价格为{9, 11, 8, 5, 7, 12, 16, 14}。如果我们能在价格为5的时候买入并在价格为16时卖出,则能收获最大的利润11。思路:因为时间顺序的存在,所以我们只要关系最小值及当前值与最小值的差值即可,遍历正如时间顺序一样一直向后推进 p...原创 2019-12-26 16:51:58 · 289 阅读 · 0 评论 -
算法学习之圆圈中最后剩下的数字
题目:0,1,···,n-1这n个数字排成一个圆圈,从数字0开始,每次从这个圆圈里删除第m个数字。求出这个圆圈里剩下的最后一个数字。解法一:使用LinkedList仿圆就可以了,很简单import java.util.*;public class Solution { public int LastRemaining_Solution(int n, int m) { ...原创 2019-12-26 16:24:38 · 216 阅读 · 0 评论 -
算法学习之扑克牌中的顺子
题目:从扑克牌中随机抽5张牌,判断是不是一个顺子,即这5张牌是不是连续的。2~10为数字本身,A为1,J为11,Q为12,K为13,而大、小王可以看成任意数字。为了方便起见,你可以认为大小王是0。思路:五个数满足下面几个条件即可(使用TreeSet实现自动有序排列)1、剩余数字+0的个数=52、排序后的最大值-最小值<53、没有重复数字import java.uti...原创 2019-12-26 11:47:43 · 294 阅读 · 0 评论 -
算法学习之n个骰子的点数
题目:把n个骰子扔在地上,所有骰子朝上一面的点数之和为s。输入n,打印出s的所有可能的值出现的概率。思路:因为暴力递归效率很低,这里我就没去看了。看一下优化的方法使用for循环有些类似动态规划,因为f(n) = f(k-1)+f(k-2)...f(k-6),意思也就是我们当前所求的n个骰子和为k的次数=和为k-1出现次数+和为k-2出现次数+...和为k-6出现次数的总和。本质就是多投...原创 2019-12-25 14:57:17 · 247 阅读 · 0 评论 -
算法学习之把字符串转换成整数
题目描述将一个字符串转换成一个整数,要求不能使用字符串转换整数的库函数。 数值为0或者字符串不是一个合法的数值则返回0思路:思路其实很简单清晰1、判断是否存在+-号,存在就标记下2、正常按顺序存取3、判断边界Integer.MAX_VALUE与Integer.MIN_VALUEimport java.util.*;public class Solution { ...原创 2019-12-24 17:27:30 · 191 阅读 · 0 评论 -
算法学习之构建乘积数组
题目描述给定一个数组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]。不能使用除法。思路:嵌套循环这里就不考虑了,因为时间复杂度n^2,这里有另一种复杂度为n的方法。把第i个数看成是左右两半的成绩,这里偷了张图,方便大家理解(哈哈,自己懒得画了)根据...原创 2019-12-23 14:44:52 · 86 阅读 · 0 评论 -
算法学习之不用加减乘除做加法
题目描述写一个函数,求两个整数之和,要求在函数体内不得使用+、-、*、/四则运算符号。思路:使用^和&进行操作1、首先使用^进行相加操作,进位不处理,因为二进制只存在0、1所以相同为同为1时此位置变为02、使用&操作配合左移<<进行进位处理3、赋值,进行下一轮操作public class Solution { public int ...原创 2019-12-23 10:56:48 · 107 阅读 · 0 评论 -
算法学习之求1+2+3+...+n
题目描述求1+2+3+...+n,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)。思路:短路思想,一看可能不知道是啥,其实就是逻辑与&&的运用public class Solution { // n==0时,&&右侧代码就不执行了。也就是递归到0时就开始结束了并返回0...原创 2019-12-21 18:14:03 · 722 阅读 · 0 评论 -
算法学习之队列的最大值
题目一:滑动窗口的最大值。给定一个数组和滑动窗口的大小,找出所有滑动窗口里数值的最大值。例如,如果输入数组{2,3,4,2,6,2,5,1}及滑动窗口的大小3,那么一共存在6个滑动窗口,他们的最大值分别为{4,4,6,6,6,5}; 针对数组{2,3,4,2,6,2,5,1}的滑动窗口有以下6个: {[2,3,4],2,6,2,5,1}, {2,[3,4,2],6,2,5,1}, {2,3,...原创 2019-12-21 15:02:23 · 333 阅读 · 0 评论 -
算法的时间与空间复杂度
https://blog.csdn.net/jsjwk/article/details/84315770转载 2019-12-21 10:55:47 · 86 阅读 · 0 评论 -
算法学习之翻转单词顺序列
题目一:翻转单词顺序。牛客最近来了一个新员工Fish,每天早晨总是会拿着一本英文杂志,写些句子在本子上。同事Cat对Fish写的内容颇感兴趣,有一天他向Fish借来翻看,但却读不懂它的意思。例如,“student. a am I”。后来才意识到,这家伙原来把句子单词的顺序翻转了,正确的句子应该是“I am a student.”。Cat对一一的翻转这些单词顺序可不在行,你能帮助他么?思...原创 2019-12-20 13:56:45 · 145 阅读 · 0 评论 -
算法学习之和为s的数字
题目一:和为s的两个数字。输入一个递增排序的数组和一个数字S,在数组中查找两个数,使得他们的和正好是S,如果有多对数字的和等于S,则输出任意一对即可。思路,看见有序递增马上想到二分查找,但是本题要求两个数之和等于目标值,所以转为双指针求和,根据相应结果调整指针位置:当两指针位置对应数字之和小于目标值则说明低位的指针过低需+1,反之则说明高位指针过高应-1。import jav...原创 2019-12-19 11:59:23 · 200 阅读 · 0 评论 -
数组中数字出现的次数
题目一:数组中只出现一次的两个数字。一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。要求时间复杂度是O(n),空间复杂度是O(1)。思路:巧妙运用异或。0与任何数异或为本身,相同数字异或为01、异或所有数,得到两个不重复的数字的亦或值2、获取得到的异或值得右起第一个1的位置3、通过获取的位置将已知的数据进行反异或,反异或后除了两个...原创 2019-12-18 15:37:36 · 144 阅读 · 0 评论 -
算法学习之二叉树的深度
题目一:二叉树的深度输入一棵二叉树,求该树的深度。从根结点到叶结点依次经过的结点(含根、叶结点)形成树的一条路径,最长路径的长度为树的深度。思路:嘿嘿,递归简简单单几行搞定,有点类似展开树求最大值。/**public class TreeNode { int val = 0; TreeNode left = null; TreeNode right = ...原创 2019-12-13 17:43:52 · 188 阅读 · 0 评论 -
算法学习之二叉搜索树的第k个结点
题目描述给定一棵二叉搜索树,请找出其中的第k小的结点。例如, (5,3,7,2,4,6,8) 中,按结点数值大小顺序第三小结点的值为4。思路:直接用中序遍历俩获取递增的有序列表就可以了/*public class TreeNode { int val = 0; TreeNode left = null; TreeNode right = null;...原创 2019-12-13 14:01:44 · 133 阅读 · 0 评论 -
算法学习之数字在排序数组中出现的次数
题目描述统计一个数字在排序数组中出现的次数。思路:看到排序树组马上想到二分查找。更爽的是Java为我们提供了apiimport java.util.*;public class Solution { public int GetNumberOfK(int [] array , int k) { int index = Arrays.binaryS...原创 2019-12-13 10:09:21 · 172 阅读 · 0 评论 -
算法学习之两个链表的第一个公共结点
题目描述输入两个链表,找出它们的第一个公共结点。思路:这题刚开始跟上题一样,直接暴力嵌套,但是太浪费时间了,因为那样时间将为O(n^2)。所以小套路又来了。首先我们发现如果两个链表有公共节点,方便理解这里到了两张图,两个链表等长(图a)或者不等长(图b)。 图a 图b等长的情况比较好处理,起始处不等长的情...原创 2019-12-10 12:02:07 · 135 阅读 · 0 评论 -
算法学习之数组中的逆序对
题目描述在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数P。并将P对1000000007取模的结果输出。 即输出P%1000000007输入描述:题目保证输入的数组中没有的相同的数字数据范围:对于%50的数据,size<=10^4对于%75的数据,size<=10^5对于%100的数...原创 2019-12-09 21:14:07 · 148 阅读 · 0 评论 -
算法学习之第一个不重复的字符
题目一:字符串中第一个只出现一次的字符。在一个字符串(0<=字符串长度<=10000,全部由字母组成)中找到第一个只出现一次的字符,并返回它的位置, 如果没有则返回 -1(需要区分大小写)。思路:有些类似于hash表,使用字母对应的ascII作为下标计数,然后遍历得到的首个计数为1的字母就是目标值了// 大小写字母一共52个,对应的ascII为65~90 97~12...原创 2019-12-07 14:33:01 · 235 阅读 · 0 评论 -
算法学习之丑数
题目:把只包含质因子2、3和5的数称作丑数(Ugly Number)。例如6、8都是丑数,但14不是,因为它包含质因子7。 习惯上我们把1当做是第一个丑数。求按从小到大的顺序的第N个丑数。思路:比较直观的就直接拿过来做除法就行了,但时间复杂度超级大,基本测试时就挂掉了。这里使用另一种思路来解。i=f(2、3、5) :i*1 =(2、3、5)i*2=(4、6、10)i*3=...原创 2019-12-06 15:50:59 · 238 阅读 · 0 评论 -
算法学习之最长不含重复字符的子字符串
题目:请从字符串中找出一个最长的不包含重复字符的子字符串,计算该最长子字符串的长度。假设字符串中只包含'a'~'z'的字符。例如,在字符串"arabcacfr"中,最长的不含重复字符的子字符串是"acfr",长度为4。跟前两道还是类似的 礼物的最大值、把数字翻译成字符串,动态规划就完事了。嘿嘿我们根据题意可推导出:当字母未出现过:1、f(i) = f(i-1)+1;当字母在之前...原创 2019-12-04 16:40:10 · 166 阅读 · 0 评论 -
算法学习之礼物的最大值
题目:在一个m×n的棋盘的每一格都放有一个礼物,每个礼物都有一定的价值(价值大于0)。你可以从棋盘的左上角开始拿格子里的礼物,并每次向右或者向下移动一格,直到到达棋盘的右下角。给定一个棋盘及其上面的礼物,请计算你最多能拿到多少价值的礼物?例如,在下面的棋盘中,如果沿着加粗的数字的线路(1、12、5、7、7、16、5),那么我们能拿到最大价值为53的礼物。1103 8...原创 2019-12-03 15:58:51 · 449 阅读 · 0 评论 -
算法学习之把数字翻译成字符串
题目:给定一个数字,我们按照如下规则把它翻译为字符串:0翻译成“a”,1翻译成“b”,……,11翻译成“l”,……,25翻译成“z”。一个数字可能有多个翻译。例如,12258有5种不同的翻译,分别是“bccfi”、“bwfi”、“bczi”、“mcfi”和“mzi”。请编程实现一个函数,用来计算一个数字有多少种不同的翻译方法。思路:到最后感觉就是一道找规律的题目。使用动态规划解题。。。...原创 2019-11-26 20:03:04 · 160 阅读 · 0 评论 -
算法学习之把数组排成最小的数
题目描述输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323。上来直接干也行,但是好像别人的技巧更秒:即a+""+b与b+""+a比较,如果a+""+b>b+""+a,则a该跟b换换位置了。import java.util.ArrayList;pub...原创 2019-11-21 14:32:22 · 168 阅读 · 0 评论 -
算法学习之数字序列中某一位的数字
题目:数字以0123456789101112131415···的格式序列化到一个字符序列中。在这个序列中,第5位(从0开始计数)是5,第13位是1,第19位是4,等等。请写一个函数,求任意第n位对应的数字。书上的思路:如输入10010~9十个数(从第0位开始)显然小于1001,所以从双位数中查找。10~99,个数为10*9*2=180,显然也小于1001-10=991。10...原创 2019-11-21 10:46:11 · 191 阅读 · 0 评论 -
算法学习之整数中1出现的次数(从1到n整数中1出现的次数)
题目描述求出1~13的整数中1出现的次数,并算出100~1300的整数中1出现的次数?为此他特别数了一下1~13中包含1的数字有1、10、11、12、13因此共出现6次,但是对于后面问题他就没辙了。ACMer希望你们帮帮他,并把问题更加普遍化,可以很快的求出任意非负整数区间中1出现的次数(从1 到 n 中1出现的次数)。那种简单的嵌套双遍历这里就不讲了,说一下另一种思路,使用归纳法总结...原创 2019-11-05 11:14:13 · 1062 阅读 · 0 评论 -
算法学习之连续子数组的最大和
题目:输入一个整型数组,数组里有正数也有负数。数组中的一个或连续多个整数组成一个子数组。求所有子数组的和的最大值。要求时间复杂度为O(n)。例如,输入的数组为{1, -2, 3, 10, -4, 7, 2, -5},和最大的子数组为{3, 10, -4, 7, 2},因此输出为该子数组的和18。思路:动态规划,通过遍历逐个累加和比对找寻最大连续子组public class Sol...原创 2019-10-31 20:47:58 · 145 阅读 · 0 评论 -
算法学习之数据流中的中位数
题目描述如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值。如果从数据流中读出偶数个数值,那么中位数就是所有数值排序之后中间两个数的平均值。我们使用Insert()方法读取数据流,使用GetMedian()方法获取当前读取数据的中位数。使用TreeMap的自然排序,key值会自动按从小到大排列,然后配合使用TreeMap的highe...原创 2019-10-31 15:50:27 · 153 阅读 · 0 评论 -
算法学习之数组中出现次数超过一半的数字
题目描述数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。如果不存在则输出0。方法一:上来第一感觉,直接嵌套遍历不就出来了吗!暴力!import java.util.*;public class Solution { public ...原创 2019-10-28 16:13:59 · 145 阅读 · 0 评论 -
算法学习之序列化二叉树
题目描述请实现两个函数,分别用来序列化和反序列化二叉树二叉树的序列化是指:把一棵二叉树按照某种遍历方式的结果以某种格式保存为字符串,从而使得内存中建立起来的二叉树可以持久保存。序列化可以基于先序、中序、后序、层序的二叉树遍历方式来进行修改,序列化的结果是一个字符串,序列化时通过 某种符号表示空节点(#),以 ! 表示一个结点值的结束(value!)。二叉树的反序列化是指:根据某种...原创 2019-10-28 11:47:56 · 91 阅读 · 0 评论 -
算法学习之二叉搜索树与双向链表
题目描述输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。思路很简单,但刚读题目时有些懵逼:中序遍历二叉树,然后调整指针即可。/**public class TreeNode { int val = 0; TreeNode left = null; TreeNode right = null...原创 2019-10-26 16:24:41 · 90 阅读 · 0 评论 -
算法学习之复杂链表的复制
题目描述输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head。(注意,输出结果中请不要返回参数中的节点引用,否则判题程序会直接返回空)思路很简单使用map进行记录,键对应原有链表节点,值对应copy链表中要用到的新对象。如果map中已经存储相应的值,进行复用,否则进行存储。/*publ...原创 2019-10-25 18:02:30 · 100 阅读 · 0 评论 -
算法学习之二叉树中和为某一值的路径
题目描述输入一颗二叉树的根节点和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。(注意: 在返回值的list中,数组长度大的数组靠前)直接点:深度优化递归,非递归也行,就是临界值很麻烦,先用递归凑合着吧,哈哈。import java.util.ArrayList;/**public class Tre...原创 2019-10-18 11:26:30 · 82 阅读 · 0 评论 -
算法学习之二叉搜索树的后序遍历序列
题目描述输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。二叉树后续遍历的顺序为:左<根<右。这里结合图(懒得画了盗的,哈哈)可以看出所有子树的根节点就是该子数组的最后一位。所以我们只需要已根节点为基准点吧数组分为左子树和右子树,然后以此类推->递归。直到我们的首索引>=根索...原创 2019-10-17 16:23:53 · 113 阅读 · 0 评论 -
算法学习之从上往下打印二叉树
题目描述从上往下打印出二叉树的每个节点,同层节点从左至右打印。该题主要是考察队列Queue的使用类似于栈。函数poll()弹出头部值并去除,peek()函数弹出头部值但不会去除,offer()拼接值到队列尾部。LinkedList实现了Queue接口。import java.util.*;/**public class TreeNode { int val = 0;...原创 2019-10-16 15:49:54 · 103 阅读 · 0 评论 -
算法学习之栈的压入、弹出序列
题目描述输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。(注意:这两个序列的长度是相等的)出栈顺序主要看栈的深度。例:入栈顺序12345。如果栈深度大于等于5则出栈顺序...原创 2019-10-16 13:57:17 · 214 阅读 · 0 评论 -
算法学习之包含min函数的栈
题目描述定义栈的数据结构,请在该类型中实现一个能够得到栈中所含最小元素的min函数(时间复杂度应为O(1))。使用同一个栈记录在频繁的pop和push时后min会有问题,所有采用双栈方式,两个栈数量保持一致,一个记录最小值,一个记录所有值。记录最小值的栈在push时,在空或者上个存储的值大于当前值时push当前值,相反则继续存储上一个最小值。import java.util.St...原创 2019-10-16 10:48:17 · 98 阅读 · 0 评论 -
算法学习之字符串的排列
题目描述输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。输入描述:输入一个字符串,长度不超过9(可能有字符重复),字符只包括大小写字母。递归:递归的出口为只剩最后一个字符的时候,然后进行字符数组的全排列,但是注意一点就是,出现重复字符时需要跳过(举...原创 2019-10-15 20:49:29 · 118 阅读 · 0 评论 -
算法学习之顺时针打印矩阵
题目描述输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下4 X 4矩阵: 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.思路:第一从左向右添加最上面一行并且添加完下移一行,避免下一轮重复添加;第二从上到下添加最右边一行并且...原创 2019-10-12 13:40:58 · 124 阅读 · 0 评论