算法
xk_一步一步来
一步一步
展开
-
剑指Offer-53:数字在排序数组中出现的次数
题目统计一个数字在排序数组中出现的次数。例如输入排序数组{1, 2, 3, 3,3, 3, 4, 5}和数字3,由于3在这个数组中出现了4次,因此输出4。思路代码1:public int GetNumberOfK(int [] array , int k) { if(array.length == 0) return 0; int between = Ge...原创 2019-04-11 18:44:28 · 135 阅读 · 0 评论 -
剑指Offer-54:二叉搜索树的第k个结点
题目:二叉搜索树的第k个结点 给定一棵二叉搜索树,按节点值从小到大排列,找出其中的第k(k≥1)个结点。主要思路:使用中序遍历,每遍历一个节点时,判断k的值,若k等于1,则当前遍历到的节点就是所求节点,否则使k减1。关键点:中序遍历时间复杂度:O(n)public class KthNodeOfTree{ private static TreeNode result; ...原创 2019-04-11 19:46:19 · 172 阅读 · 0 评论 -
剑指Offer-55:二叉树的深度 与 平衡二叉树
题目:二叉树的深度 输入一棵二叉树的根结点,求该树的深度。从根结点到叶结点依次经过的结点(含根、叶结点)形成树的一条路径,最长路径的长度为树的深度。主要思路:使用递归,分别计算当前节点的左右子树的深度,取两者最大值,再加1。或者借助队列,使用层序遍历,每遍历一层,深度加1.关键点:递归,层序遍历时间复杂度:O(n)public class TreeDepth{ public s...原创 2019-04-11 20:38:14 · 125 阅读 · 0 评论 -
剑指Offer-56:数组中只出现一次的两个数字 和 数组中唯一的只出现一次的数字
题目:数组中只出现一次的两个数字 一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。要求时间复杂度是O(n),空间复杂度是O(1)。主要思路:根据异或运算的性质:数字异或它自身等于0。若数组中只有一个数字出现一次 ,其他数字都出现2次,那么从头到尾异或数组每个的数字,则最后结果就是只出现一次的数字。 相同的思路,若能把当前题目中的数组分成两个子数...原创 2019-04-12 09:52:10 · 260 阅读 · 0 评论 -
剑指Offer-57:和为s的两个数字
题目:和为s的两个数字输入一个递增排序的数组和一个数字s,在数组中查找两个数,使得它们的和正好是s。如果有多对数字的和等于s,输出任意一对即可。主要思路:由于数组递增,则可以选择从最小值和最大值开始寻找,左边指针指向最小值,右边指针指向最大值,若两个数的和小于s,则增大较小的值(即左边指针向中间移动);若两个数的和大于s,则减小较大的值(即右边指针向中间移动);若等于s,则找到,否则,左右指针...原创 2019-04-12 09:53:54 · 151 阅读 · 0 评论 -
剑指Offer-57(二):和为s的连续正数序列
题目:和为s的连续正数序列输入一个正数s,打印出所有和为s的连续正数序列(至少含有两个数)。例如输入15,由于1+2+3+4+5=4+5+6=7+8=15,所以结果打印出3个连续序列1~5、4~6和7~8。主要思路:使用两个数min和max来表示连续序列的最小值和最大值,初始化min为1,max为2。若序列和小于s,为了使序列包含更多的数,增大max;若序列和大于s,为了使序列包含更少的数,增...原创 2019-04-12 10:52:11 · 126 阅读 · 0 评论 -
剑指Offer-59: 滑动窗口的最大值 和 队列的最大值
题目给定一个数组和滑动窗口的大小,请找出所有滑动窗口里的最大值。例如,如果输入数组{2, 3, 4, 2, 6, 2, 5, 1}及滑动窗口的大小3,那么一共存在6个滑动窗口,它们的最大值分别为{4, 4, 6, 6, 6, 5}思路法一:简单的暴力法法二:双向队列.用一个双向队列,队列第一个位置保存当前窗口的最大值,当窗口滑动一次,判断当前最大值是否过期(当前最大值的位置是不是在窗口之外...原创 2019-04-12 15:28:45 · 143 阅读 · 0 评论 -
剑指Offer-62:圆圈中最后剩下的数字
题目 0, 1, …, n-1这n个数字排成一个圆圈,从数字0开始每次从这个圆圈里删除第m个数字。求出这个圆圈里剩下的最后一个数字。思路 方法一:采用链表来存放数据,每次对长度取余来实现循环 将所有数字放入LinkedList链表中(LinkedList比ArrayList更适合增删操作)。假设当前删除的结点下标为removeIndex,则下一个要删除的结点的下标为:(removeI...原创 2019-04-12 17:11:46 · 145 阅读 · 0 评论 -
剑指Offer-65:不用加减乘除做加法
题目写一个函数,求两个整数之和,要求在函数体内不得使用+、-、×、÷四则运算符号。思路对数字做运算,除了四则运算外,只剩下位运算了。根据一般情况下的加法步骤,设计如下:1)不考虑进位对每一位相加:1加0,0加1都等于1,而0加0,1加1等于0,所以使用异或^操作;2)计算进位:只有1加1产生进位,所以采用位与&操作,再左移1位;3)将和与进位相加,即重复前两步操作。结束判断为进...原创 2019-04-12 19:15:25 · 135 阅读 · 0 评论 -
剑指Offer-51:数组中的逆序对
题目描述 在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数。例如:在数组{7,5,6,4}中,一共存在5对逆序对,分别是{7,5},{7,4},{7,6},{5,4},{6,4}。  ...原创 2019-04-11 16:33:59 · 142 阅读 · 0 评论 -
剑指Offer-50:第一个只出现一次的字符
题目一: 在一个字符串(0<=字符串长度<=10000,全部由字母组成)中找到第一个只出现一次的字符,并返回它的位置, 如果没有则返回 -1. 如输入“abaccdeff”,则输出“b”。 &nbs...原创 2019-04-11 13:57:23 · 264 阅读 · 0 评论 -
动态规划5:编辑距离算法(Edit Distance)
https://blog.csdn.net/Grace_0642/article/details/53944188#概念编辑距离的作用主要是用来比较两个字符串的相似度的基本的定义如下所示:编辑距离,又称Levenshtein距离(莱文斯坦距离也叫做Edit Distance),是指两个字串之间,由一个转成另一个所需的最少编辑操作次数,如果它们的距离越大,说明它们越是不同。许可的编辑操作包括...原创 2019-03-27 11:40:00 · 1254 阅读 · 0 评论 -
动态规划6:买卖股票 I II III IV 冷却,共5题
转自:https://blog.csdn.net/Dr_Unknown/article/details/51939121Best Time to Buy and Sell Stock IDescription: Say you have an array for which the ith element is the price of a given stock on day i. ...转载 2019-03-27 14:12:37 · 280 阅读 · 0 评论 -
3道题彻底搞定:套路解决递归问题
前言相信不少同学和我一样,在刚学完数据结构后开始刷算法题时,遇到递归的问题总是很头疼,而一看解答,却发现大佬们几行递归代码就优雅的解决了问题。从我自己的学习经历来看,刚开始理解递归思路都很困难,更别说自己写了。我一直觉得我一直觉得刷算法题和应试一样,既然是应试就一定有套路存在。在刷题中,我总结出了一套解决递归问题的模版思路与解法,用这个思路可以秒解很多递归问题。我一直觉得刷算法题和应试一样,...转载 2019-04-10 12:39:59 · 496 阅读 · 0 评论 -
java递归实现反转一个单链表
反转一个单链表。示例:输入: 1->2->3->4->5->NULL输出: 5->4->3->2->1->NULL//此题有收获,注意returnValue 的作用(仅用于返回)public ListNode reverseList(ListNode head) { if(head == null) return nu...原创 2019-04-10 20:13:34 · 1692 阅读 · 0 评论 -
数字序列中某一位的数字
题目描述 数字以01234567891011121314…的格式序列化到一个字符序列中。在这个序列中,第5位是5(从0开始),第13位是1,第19位是4,等等。请写一个函数,求任意第n位对应的数字。 最直观...原创 2019-04-11 09:20:18 · 236 阅读 · 0 评论 -
把数组排成最小的数
题目描述输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323。解题思路先将数组转换成字符串数组,然后对字符串数组按照规则排序,最后将排好序的字符串数组拼接出来。关键就是制定排序规则:若ab > ba 则 a > b若ab < ba 则 a <...原创 2019-04-11 09:34:21 · 101 阅读 · 0 评论 -
剑指Offer-46:把数字翻译成字符串
题目描述 给定一个数字,我们按照如下规则把它翻译为字符串:0翻译成‘a’,1翻译成‘b’,……,11翻译成‘l’,……,25翻译成‘z’。一个数值可能翻译成多个字符串。例如:12258有5种不同的翻译,分别是“bccfi”、“bwfi”、“bczi”、“mcfi”、“mzi”。请编程实现一个函数,用来计...原创 2019-04-11 10:33:43 · 149 阅读 · 0 评论 -
剑指Offer-48:最长的不包含重复字符的子字符串
题目描述 请从字符串中找出一个最长的不包含重复字符的子字符串,计算该最长子字符串的长度。假设,字符串中只包含‘a-z’的字符。例如,在字符串“arabcacfr”中,最长的不含重复字符的子字符串是“acfr”,长度为4 。 &nb...原创 2019-04-11 11:16:05 · 381 阅读 · 0 评论 -
剑指Offer-49:丑数
题目描述把只包含质因子2、3和5的数称作丑数(Ugly Number)。例如6、8都是丑数,但14不是,因为它包含质因子7。 习惯上我们把1当做是第一个丑数。求按从小到大的顺序的第N个丑数。什么叫质因子以255这个数为例讲解质因子就是质数的因子,也称质因数或质约数。 255的因子有1 、3、5、15、17、51、85、255。其中是质数的是1、3、5、17 所以255的质因子就是1、3、5...原创 2019-04-11 13:11:16 · 154 阅读 · 0 评论 -
不使用加减运算符实现整数相加(详解)
一、问题分析不用加减号实现加减法运算,这个题目一听就知道要用位运算符了,复习下位运算的基本操作吧:与运算符(&): 如果相对应位都是1,则结果为1,否则为0 或运算符(|): 如果相对应位都是0,则结果为0,否则为1非运算符(~): 按位取反运算符翻转操作数的每一位,即0变成1,1变成0。异或运算符(^): 如果相对应位值相同,则结果为0,否则为1再来想想十进制加法如何...原创 2019-04-12 19:59:22 · 990 阅读 · 0 评论 -
剑指Offer-66:构建乘积数组
题目 给定一个数组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-04-12 20:51:42 · 123 阅读 · 0 评论 -
剑指Offer-19: 正则表达式匹配
题目 请实现一个函数用来匹配包含'.'和'*'的正则表达式。模式中的字符'.'表示任意一个字符,而'*'表示它前面的字符可以出现任意次(含0次)。在本题中,匹配是指字符串的所有字符匹配整个模式。例如,字符串"aaa"与模式"a.a"和"ab*ac*a"匹配,但与"aa.a"及"ab*a"均不匹配。思路 使用函数matchCore(char[] str, int indexOfStr, c...原创 2019-04-16 15:30:34 · 118 阅读 · 0 评论 -
剑指Offer-38: 字符串的排列
题目:输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。输入描述: 输入一个字符串,长度不超过9(可能有字符重复),字符只包括大小写字母。解题思路刚看题目的时候,可能会觉得这个问题很复杂,不能一下子想出解决方案。那我们就要学会把复杂的问题分解成小问题。我们求整...原创 2019-04-14 22:33:46 · 165 阅读 · 0 评论 -
剑指Offer-37:序列化二叉树
题目 请实现两个函数,分别用来序列化和反序列化二叉树。思路 一般情况下,需要采用前/后序遍历和中序遍历才能确定一个二叉树,但是其实可以只采用前序遍历(从根结点开始),将空结点(null)输出为一个特殊符号(如“$”),就可以确定一个二叉树了。 将二叉树序列化为字符串,就是前序遍历的过程,遇见空结点时,序列化为“$”,每个结点间使用逗号分隔开。 将字符串反序列化为二叉...原创 2019-04-15 09:29:13 · 167 阅读 · 0 评论 -
贪心算法总结示例与钞票问题
贪心算法通常也会结合其他知识点一并考察(如排序、栈、堆排序等)(预备知识)贪心法求解钞票问题这里有几种不同面额的钞票,1元、5元、10元、20元、100元、200元的钞票无穷多张,现在使用这些钞票去支付X元的面额,问最少需要多少张?例如X=628,我们通常会尝试从面额最大的钞票(200元)开始尝试,此时发现200元的钞票只能使用3张,此时剩余的面额是628-3*200=28元,再依次查看次最...原创 2019-04-23 14:48:11 · 879 阅读 · 0 评论 -
算法笔试题:1元,5元,10元,20元,50元、100元面值人民币组合给定x元的问题
最近有一道笔试题引起了小伙伴们的激烈讨论。参考博客作为算法菜鸟非常感谢大神的分析和举例。博客地址问题描述目前市面上的纸币主要有1元,5元,10元,20元,50元、100元六种,如果要买一件商品x元,有多少种货币组成方式? 思路一现有6种面额的纸币用来组合成给定的x元金额。那么可以大致推出这个等式sum 表示给定的金额{x1, x2, x3, x4, x5, x6}分别表示1元,5...转载 2019-04-23 14:58:27 · 14477 阅读 · 1 评论 -
剑指Offer-34: 二叉树中和为某一值的路径
题目 输入一棵二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。思路 1.假设找到了其中一条路径,达到叶结点后,由于没有指向父结点的指针,所以必须提前创建一个链表存储前面经过的结点。 2.由于是从根结点出发,所以要想到使用前序遍历 3.利用链表存储结点,在该结点完成左右子树的路径搜索后(即递归函数结束,返回...原创 2019-04-18 22:57:21 · 122 阅读 · 0 评论 -
剑指Offer-36:二叉搜索树与双向链表
题目 输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。思路 二叉搜索树、排序链表,想到使用中序遍历。 要实现双向链表,必须知道当前结点的前一个结点。根据中序遍历可以知道,当遍历到根结点的时候,左子树已经转化成了一个排序的链表了,根结点的前一结点就是该链表的最后一个结点(这个结点必须记录下来,将遍历函数的返回值设置为该...原创 2019-04-18 23:25:43 · 141 阅读 · 0 评论 -
二叉搜索树与双向链表(Java)
https://blog.csdn.net/u013132035/article/details/80638812转载 2019-04-18 23:57:39 · 82 阅读 · 0 评论 -
剑指Offer-38:字符串的排列
题目输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。思路刚看题目的时候,可能会觉得这个问题很复杂,不能一下子想出解决方案。那我们就要学会把复杂的问题分解成小问题。我们求整个字符串的排列,其实可以看成两步:第一步求所有可能出现在第一个位置的字符(即把第一个字符和后面...原创 2019-04-19 09:21:08 · 182 阅读 · 0 评论 -
剑指Offer汇总
剑指Offer汇总:import java.util.ArrayList;import java.util.Arrays;import java.util.Collections;import java.util.Comparator;import java.util.HashMap;import java.util.HashSet;import java.util.LinkedLi...原创 2019-04-19 11:08:35 · 180 阅读 · 0 评论 -
剑指Offer-41:数据流中的中位数
题目:数据流中的中位数 获取数据流中的中位数。如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值。如果从数据流中读出偶数个数值,那么中位数就是所有数值排序之后中间两个数的平均值。主要思路:可以把输入数据平分成两部分,左边的数据都小于右边的数据,那么即使左右两边内部的数据没有排序,也可以根据左边最大的数和右边最小的数获取中位数。关键是,怎么获取左边的最大值和右边的最小值...原创 2019-04-14 21:42:57 · 135 阅读 · 0 评论 -
剑指Offer-50:字符串中第一个只出现一次的字符
题目 请实现一个函数用来找出字符流中第一个只出现一次的字符。例如,当从字符流中只读出前两个字符"go"时,第一个只出现一次的字符是"g"。当从该字符流中读出前六个字符“google"时,第一个只出现一次的字符是"l"。思路 由于字符(char)是长度为8的数据类型,共有256中可能,因此哈希表可以用一个长度为256的数组来代替,数组的下标相当于键值key,对应字符的ASCII码值;数组...原创 2019-04-14 16:56:21 · 165 阅读 · 0 评论 -
回溯算法超通俗易懂详尽分析和例题
转自:https://blog.csdn.net/sinat_27908213/article/details/80599460 回溯法是很重要的一种算法,在it企业笔试中经常会遇到。事实上,在各种编程题中,大家或多或少都会接触到这些题目,但是很多人没有对这类题目有个系统性的总结。接下来就对回溯法进行详...原创 2019-04-20 20:50:02 · 601 阅读 · 1 评论 -
从零开始学回溯算法
转自:https://blog.csdn.net/qq_32400847/article/details/51474105本文在写作过程中参考了大量资料,不能一一列举,还请见谅。回溯算法的定义:回溯算法也叫试探法,它是一种系统地搜索问题的解的方法。回溯算法的基本思想是:从一条路往前走,能进则进,不能进则退回来,换一条路再试。解题的一般步骤是:1.定义一个解空间,它包含问题的解;2.利用适...转载 2019-04-20 20:57:12 · 283 阅读 · 0 评论 -
剑指Offer-68:树中两个结点的最低公共祖先
题目 输入两个树结点,求它们的最低公共祖先。思路 该题首先要和面试官确定是否为二叉树,得到肯定答复后,还要确定是否为二叉搜索树,是否有父指针,或者仅仅是普通二叉树。 1.树为二叉搜索树时,最低公共祖先结点的大小在两个树结点大小的中间。 2.树为普通树时,使用遍历将子结点的信息往上传递。在左右子树中进行查找是否存在两个树结点,如果两个树结点分别在左右子树上,说明该根结点就是它们的最...原创 2019-04-13 21:13:26 · 303 阅读 · 0 评论 -
回溯法 求一个子集问题:装载问题、最大团问题
https://blog.csdn.net/jeffleo/article/details/54579367一:装载问题有一批共n个集装箱要装上2艘载重量分别为c1和c2的船,其中集装箱i的重量为wi,且装载问题要求确定是否有一个合理的装载方案可将这些集装箱装上这2艘船。如果有,找出一种装载方案。例如当n=3,c1=c2=50且w=[10,40,40]时,则可以将集装箱1和2装到第一艘轮船...转载 2019-04-21 17:08:02 · 413 阅读 · 0 评论 -
剑指Offer-11:矩阵中的路径
题目 请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径。路径可以从矩阵中任意一格开始,每一步可以在矩阵中向左、右、上、下移动一格。如果一条路径经过了矩阵的某一格,那么该路径不能再次进入该格子。例如在下面的3×4的矩阵中包含一条字符串“bfce”的路径(路径中的字母用下划线标出)。但矩阵中不包含字符串“abfb”的路径,因为字符串的第一个字符b占据了矩阵中的第一行第二个...原创 2019-04-14 00:46:52 · 116 阅读 · 0 评论 -
【回溯法】--批处理作业调度
https://blog.csdn.net/qian2213762498/article/details/79420060【回溯法】--批处理作业调度1、问题描述 每一个作业Ji都有两项任务分别在2台机器上完成。每个作业必须先有机器1处理,然后再由机器2处理。作业Ji需要机器j的处理时间为tji。对于一个确定的作业调度,设Fji是作业i在机器j上完成处理时间。则所有作业在机器2上...转载 2019-04-21 21:42:53 · 586 阅读 · 0 评论