算法总结
写吧HJ
向着数据研发工程师不断努力
展开
-
最大值与最小值之差小于等于指定值的子数组个数
解题思路首先明确两点: 1、如果子数组arr[i…j]满足条件,那么arr[i…j]中的子数组一定也满足条件。 2、如果子数组arr[i…j]不满足条件,那么包含arr[i…j]的子数组一定也不满足条件。使用两个双端队列qmin和qmax,qmin用来维护子数组arr[i…j]的最小值更新,qmax用来维护子数组arr[i…j]的最大值更新。队头表示的就是子数组arr[i…j]的...原创 2019-05-26 10:21:30 · 851 阅读 · 0 评论 -
链表中倒数第k个节点
题目描述输入一个链表,输出该链表中倒数第k个结点。解题思路建立两个指针,一个领先另一个k步,同时前进,前面的指针到头,后面的那个是倒数第k个代码public ListNode FindKthToTail(ListNode head,int k) { if(head==null || k==0) return null; int len=0; ListNode ...原创 2019-04-23 15:06:37 · 79 阅读 · 0 评论 -
反转链表
public static ListNode reverse(ListNode head){ if (head==null || head.next==null) return head; ListNode last=null; ListNode tmp; while(head!=null){ tmp=head.next; head...原创 2019-04-23 15:05:12 · 78 阅读 · 0 评论 -
删除链表中重复的节点
题目描述在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5。解题思路设置两个根节点p1和p2,p1负责更改原链表,p2负责检测并跳过重复的节点。当发现p2与p2的下一个节点值相等时,将p2后移直到p2指向的节点为非重复节点...原创 2019-04-23 15:03:37 · 87 阅读 · 0 评论 -
找到链表中的第一个公共节点
题目描述输入两个链表,找出它们的第一个公共结点。解题思路在只包含next节点的前提下,如果两个链表有公共节点,那么这两个链表在公共节点之后的所有节点一定是重合的。即他们一定是“Y”字形,而不可能是“X”字形。所以这两个链表的区别就在于公共节点之前,如果两个链表的在公共节点之前的长度相等,且不重合,那么两个头指针同步前进直到两指针相等即可找到第一个公共节点。但是,公共节点之前,如果两个链表...原创 2019-04-23 15:01:16 · 431 阅读 · 0 评论 -
最大乘积 – 拼多多2018笔试
题目描述解题思路设max1、max2、max3分别为第1大到第3大的数,min1、min2分别为第1小到第2小的数。思路: 如果数组中全是正数:结果为max1max2max3 如果数组中全是负数:结果为max1min1min2 如果数组中有正有负:结果为:max{ max1max2max3,max1min1min2}解题方法:在遍历数组是需要记录第一,第二,第三大,和最小...原创 2019-04-23 14:59:19 · 113 阅读 · 0 评论 -
扑克牌顺子
题目描述LL今天心情特别好,因为他去买了一副扑克牌,发现里面居然有2个大王,2个小王(一副牌原本是54张_)…他随机从中抽出了5张牌,想测测自己的手气,看看能不能抽到顺子,如果抽到的话,他决定去买体育彩票,嘿嘿!!“红心A,黑桃3,小王,大王,方片5”,“Oh My God!”不是顺子…LL不高兴了,他想了想,决定大\小 王可以看成任何数字,并且A看作1,J为11,Q为12,K为13。上面的5张...原创 2019-04-23 14:56:08 · 106 阅读 · 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,[4,2,6],2,5...原创 2019-04-23 14:54:18 · 87 阅读 · 0 评论 -
数组中的逆序对
题目描述在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数P。并将P对1000000007取模的结果输出。 即输出P%1000000007解题思路这道题是归并排序的变形。我在思考的时候也想到可以用分治的思想来解决,但是在两个子数组如何合并的问题上没有想清楚。这道题的解题代码,其实可以在归并排序的基础上进行。其与归并排序...原创 2019-04-23 14:51:20 · 106 阅读 · 0 评论 -
和为S的连续正数序列
题目描述小明很喜欢数学,有一天他在做数学作业时,要求计算出9~16的和,他马上就写出了正确答案是100。但是他并不满足于此,他在想究竟有多少种连续的正数序列的和为100(至少包括两个数)。没多久,他就得到另一组连续正数和为100的序列:18,19,20,21,22。现在把问题交给你,你能不能也很快的找出所有和为S的连续正数序列? Good Luck!解题思路代码public Array...原创 2019-04-23 14:48:24 · 101 阅读 · 0 评论 -
把数组排成最小的数
题目描述输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323。解题思路数组中所有的数拼接后有可能会超过整数的范围,因此本题必须要使用字符串来处理。要对3,32 ,321 排序,不能直接比较32,3的大小,应该比较323,332的大小,即,3,32的大小应该有323,33...原创 2019-04-23 14:45:47 · 86 阅读 · 0 评论 -
二叉搜索树中的后序遍历序列
题目描述输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。解题思路方法:递归判断序列中是否可以被最后一个值划分因为是二叉搜索树的后序遍历,所以序列中的最后一个值为根节点,且根节点的值大于左子树所有值,小于右子树所有值。代码public class VerifySquenceOfBST { p...原创 2019-04-26 11:59:25 · 257 阅读 · 0 评论 -
复杂链表的复制
题目描述输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head。(注意,输出结果中请不要返回参数中的节点引用,否则判题程序会直接返回空)解题思路剑指offer中面试题26代码public class CloneRandomList { public RandomListNode Clone...原创 2019-04-24 09:30:18 · 105 阅读 · 0 评论 -
把二叉树打印成多行
问题描述从上到下按层打印二叉树,同一层结点从左至右输出。每一层输出一行。解题思路按层次遍历即可代码public static ArrayList<ArrayList<Integer>> traversalByLayer(TreeNode<Integer> pRoot){ ArrayList<ArrayList<Integer>...原创 2019-04-24 11:41:40 · 75 阅读 · 0 评论 -
按之字形顺序打印二叉树
问题描述请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推。解题思路在按层次遍历的基础上,增加方向标记标量,以及实现逆序的代码即可。代码public ArrayList<ArrayList<Integer>> Print(TreeNode pRoot) { Arra...原创 2019-04-24 11:42:51 · 71 阅读 · 0 评论 -
求最大子矩阵的大小
题目描述给定一个整型矩阵map,其中的值只有0,1两种,求全是1 的所有矩阵区域中,最大的矩形区域为1的数量。 例如: 1 1 1 0,其中最大的矩形区域有3个1,所以返回3 例如: 1 0 1 11 1 1 1 1 1 1 0 其中,最大的矩形区域有6个1,所以返回6解题思路如果矩阵的大小为 O(N * M) , 如何达到时间复杂度为O( N...原创 2019-05-26 10:19:07 · 242 阅读 · 0 评论 -
构造数据的MaxTree
题目描述一个数组的MaxTree定义如下: 数组必须没有重复元素。 MaxTree是一棵二叉树, 数组的每一个值对应一个二叉树节点。 包括MaxTree树在内且在其中的每一棵子树上, 值最大的节点都是树的头。 给定一个没有重复元素的数组arr, 写出生成这个数组的MaxTree的函数, 要求如果数组长度为N, 则时间复杂度为O(N)、 额外空间复杂度为O(N)。解题思路解法一...原创 2019-05-26 10:15:41 · 242 阅读 · 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,[4,2,6],2,5...原创 2019-05-26 10:10:01 · 206 阅读 · 0 评论 -
汉诺塔问题
题目描述汉诺塔问题是一个经典的问题。汉诺塔(Hanoi Tower),又称河内塔,源于印度一个古老传说。大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,任何时候,在小圆盘上都不能放大圆盘,且在三根柱子之间一次只能移动一个圆盘。问应该如何操作?分析如果是初次接触类似的问题,...原创 2019-05-26 09:55:27 · 225 阅读 · 0 评论 -
用一个栈实现另一个栈的排序
解题思路假设需要被排序的栈为stack申请一个栈helper,当栈stack不为空的时,出栈stack栈顶的元素,标记为cur若helper为空或者stack栈顶的元素大于等于cur,将cur压入helper中,否则将helper中的元素弹出到stack中,直到helper为空或helper栈顶的元素小于等于cur,再将cur压入helper中,如此反复,直到stack为空(此时,helpe...原创 2019-05-26 09:42:49 · 112 阅读 · 0 评论 -
猫狗队列
题目描述实现一种猫狗队列可以add,pollAll,pollDog,pollCat,isEmpty,isDogEmpty,isCatEmpty要求如下:用户可以调用add方法将cat类或者dog类的实例放入队列中;用户可以调用pollAll方法,将队列中所有的实例按照队列的先后顺序依次弹出;用户可以调用pollDog方法,将队列中dog类的实例按照队列的先后顺序依次弹出;用户可以调...原创 2019-05-26 09:23:56 · 118 阅读 · 0 评论 -
如何引用递归函数和栈操作逆序一个栈
题目描述一个栈一次压入1,2,3,4,5,那么从栈顶到栈底分别为5,4,3,2,1。将这个栈转置后,从栈顶到栈底位1,2,3,4,5,也就是实现栈中元素的逆序,但是只能用递归函数来实现,不能用其它数据结构解题描述先将栈stack的栈底元素返回并移除,然后依次再压入代码public class ReverseStack{ public void reverse(Stack&...原创 2019-05-26 09:20:11 · 123 阅读 · 0 评论 -
字符串转化的最小操作数
题目描述Given two words word1 and word2, find the minimum number of operations required to convert word1to word2.You have the following 3 operations permitted on a word:Insert a characterDelete a cha...原创 2019-05-08 20:12:15 · 1544 阅读 · 0 评论 -
序列化二叉树
问题描述请实现两个函数,分别用来序列化和反序列化二叉树思路描述a) 思路一:首先想到的就是这个思路,先计算出二叉树的前序、中序、后序遍历中的两个,将这2个遍历结果作为序列化后的字符串中的主要内容;解析时,拿到这两个遍历结果,重构二叉树即可。(刷题时忘了重构二叉树的思路,就没用这个方法)b) 思路二:根据层序遍历结果,将二叉树序列化为字符串,然后根据层序结果重构二叉树 – 应该借助split...原创 2019-04-24 11:48:05 · 158 阅读 · 0 评论 -
二叉树的第k个节点
问题描述给定一棵二叉搜索树,请找出其中的第k小的结点。例如, (5,3,7,2,4,6,8) 中,按结点数值大小顺序第三小结点的值为4。思路解析二叉搜索树的中序遍历结果是有序的,所以直接中序遍历,然后输出第k个结果就好了。代码public class KthNode { ArrayList<TreeNode> TraversalRes = new ArrayL...原创 2019-04-24 11:46:11 · 142 阅读 · 0 评论 -
对称的二叉树 – 重点
题目描述请实现一个函数,用来判断一颗二叉树是不是对称的。注意,如果一个二叉树同此二叉树的镜像是同样的,定义其为对称的。思路解析思路:首先根节点以及其左右子树,左子树的左子树和右子树的右子树相同左子树的右子树和右子树的左子树相同即可,采用递归非递归也可,采用栈或队列存取各级子树根节点代码public class isSymmetrical { boolean isSymmetric...原创 2019-04-24 11:44:59 · 117 阅读 · 0 评论 -
树的子结构
题目描述输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)解题思路1、首先设置标志位result = false,因为一旦匹配成功result就设为true,剩下的代码不会执行,如果匹配不成功,默认返回false2、递归思想,如果根节点相同则递归调用DoesTree1HaveTree2(),如果根节点不相同,则判断tree1的左子树和tree2是...原创 2019-04-26 11:58:06 · 206 阅读 · 0 评论 -
重建二叉树
题目描述输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。解题思路方法:递归解决思路:重建二叉树只能通过前序遍历和中序遍历或者中序遍历和后序遍历来实现,因为其原理就是递归实现通过前序遍历中的第一个节点(根节...原创 2019-04-26 11:56:58 · 209 阅读 · 0 评论 -
二叉树中和为某一值的路径
题目描述输入一颗二叉树的跟节点和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。(注意: 在返回值的list中,数组长度大的数组靠前)解题思路代码public class FindPathWithSum { ArrayList<ArrayList<Integer>> res =...原创 2019-04-26 11:48:04 · 239 阅读 · 0 评论 -
算法题目总结 -- 最长回文子串
题目描述给定一个字符串,找出其中最长的回文子串解题思路暴力法最容易想到的就是暴力破解,求出每一个子串,之后判断是不是回文,找到最长的那个求每一个子串时间复杂度O(N^2), 判断子串是不是回文O(N),两者是相乘关系,所以时间复杂度为O(N^3)。动态规划...原创 2019-03-19 00:25:47 · 389 阅读 · 0 评论 -
算法题目总结 -- 字符串的全排列
题目描述输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。解题思路从字符串数组中每次选取一个元素,作为结果中的第一个元素。然后,对剩余的元素全排列,步骤跟上面一样。很明显这是个递归处理的过程,一直到最后即可。代码import java.util.Arrays;p...原创 2019-03-21 23:06:42 · 201 阅读 · 0 评论 -
算法题目总结 -- 正则表达式匹配
问题描述请实现一个函数用来匹配包括’.‘和’‘的正则表达式。模式中的字符’.‘表示任意一个字符,而’'表示它前面的字符可以出现任意次(包含0次)。 在本题中,匹配是指字符串的所有字符匹配整个模式。例如,字符串"aaa"与模式"a.a"和"abaca"匹配,但是与"aa.a"和"ab*a"均不匹配解题思路这道题采取动态规划的方式来解答。首先,定义一个二维数组DP[][],DP[i][j]表示...原创 2019-03-21 23:04:41 · 524 阅读 · 0 评论 -
算法题目总结 -- 表示数值的字符串
问题描述请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。例如,字符串"+100",“5e2”,"-123",“3.1416"和”-1E-16"都表示数值。 但是"12e",“1a3.14”,“1.2.3”,"±5"和"12e+4.3"都不是。解题思路用正则表达式代码public class Solution { public boolean isNumeric(c...原创 2019-03-21 22:57:08 · 90 阅读 · 0 评论 -
算法题目总结 -- 用kmp算法字符串匹配的问题
字符串匹配概念字符串匹配问题的形式定义:字符串1 – str1:长度为m的字符串字符串2 – str2:长度为n的字符串,其中m>=n求解:str2是否为str1的一个子串通用方法暴力求解遍历str1,从str1中的每一位开始尝试匹配,逐个比较str1和str2中的字符是否相等,若str2完全匹配,则返回这一位的索引;否则,尝试在str1的下一位开始匹配。时间复杂度为O(m...原创 2019-03-21 22:55:27 · 343 阅读 · 0 评论 -
算法题目总结 -- 最长不重复子串
解题思路遇到不重复首先要想到用set来解决问题遇到字符串或者数组类的问题首先想在复杂度下能否解决问题,即在一次遍历序列的过程中,解决问题针对最长不重复子串的思路在一次遍历中,维护一个set集合,代表字符串S中S[0…i]中最长不重复子串中的元素种类,变量start为当前不重复子串的起始索引,变量end为当前不重复子串的结束索引,变量res表示S[0…i]中最长不重复子串的长度。...原创 2019-03-21 22:18:17 · 347 阅读 · 0 评论 -
算法题目总结 -- 栈的压入、弹出序列
题目描述输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。(注意:这两个序列的长度是相等的)解题思路借用一个辅助的栈,遍历压栈顺序,先讲第一个放入栈中,这里是1,然后判断栈顶元...原创 2019-03-21 22:15:49 · 167 阅读 · 0 评论 -
算法题目总结 -- 包含Min的
算法目的描述义栈的数据结构,请在该类型中实现一个能够得到栈中所含最小元素的min函数(时间复杂度应为O(1))思路思路:利用一个辅助栈来存放最小值栈 3,4,2,5,1辅助栈 3,3,2,2,1每入栈一次,就与辅助栈顶比较大小,如果小就入栈,如果大就入栈当前的辅助栈顶当出栈时,辅助栈也要出栈这种做法可以保证辅助栈顶一定都当前栈的最小值代码import java.util....原创 2019-03-21 22:13:23 · 60 阅读 · 0 评论 -
算法题目总结 -- 最长公共子序列
问题描述在两个字符串中,有些字符会一样,可以形成的子序列也有可能相等,因此,长度最长的相等子序列便是两者间的最长公共字序列,其长度可以使用动态规划来求。以s1={1,3,4,5,6,7,7,8},s2={3,5,7,4,8,6,7,8,2}为例。最长公共子序列与最长公共子串问题的区别为:子序列意味着子串可以不必在母串中连续存在解题思路求最长子序列长度两个字符串对应的最长公共子序列不一...原创 2019-03-21 22:06:40 · 424 阅读 · 0 评论 -
算法题目总结 -- 最长公共子串
问题描述描述:计算两个字符串的最大公共子串(Longest Common Substring)的长度,字符不区分大小写。输入:输入两个字符串输出:输出一个整数样例输入:asdfas werasdfaswer样例输出:6解题思路这里的最大公共字串要求的字串是连续的。求字串的方法和求子序列方法类似:当str1[i] ==str2[j]时,子序列长度veca[i][j]= ...原创 2019-03-21 21:58:46 · 811 阅读 · 0 评论 -
二维数组中的查找
题目描述来自《剑指offer》的原题,但是实现了两种方法并对时间效率进行了测试。解题思路第一种 – 二维矩阵中的二分法这种方法思路跟剑指offer原文中的思路相似step1: 规定矩阵size ⇒ (m, n)step2: 建立坐标点上下限 ⇒ x = (0,m-1), y = (0,n-1)step3: 通过二分法逐步确定我们所选取点的坐标,比如第一步为((0 + m-1)/2,...原创 2019-03-25 13:26:38 · 114 阅读 · 0 评论