![](https://img-blog.csdnimg.cn/20191120155231977.jpg?x-oss-process=image/resize,m_fixed,h_224,w_224)
剑指 offer
TransientYear
凑个32块的整
展开
-
二分查找总结
文章目录原理及步骤代码模板及其改进编程练习标准的二分查找实战1:猜数字大小二分查找(Binary Search)也叫作折半查找。二分查找有两个要求:一个是数列有序另一个是数列使用顺序存储结构(比如数组)原理及步骤二分查找法实质上是不断地将有序数据集进行对半分割,并检查每个分区的中间元素。帮组理解漫画。实现步骤:将表中间位置记录的关键字与查找关键字比较,如果两者相等,则查找成功...原创 2019-11-22 15:26:28 · 1107 阅读 · 0 评论 -
五大常用算法之-动态规划
文章目录基本概念基本思想与策略基本概念动态规划过程是:每次决策依赖于当前状态,又随即引起状态的转移。一个决策序列就是在变化的状态中产生出来的,所以,这种多阶段最优化决策解决问题的过程就称为动态规划。基本思想与策略基本思想与分治法类似,也是将待求解的问题分解为若干个子问题(阶段),按顺序求解子阶段,前一子问题的解,为后一子问题的求解提供了有用的信息。在求解任一子问题时,列出各种可能的局部解,...原创 2019-11-11 17:31:29 · 400 阅读 · 0 评论 -
五大常用算法之-回溯法
文章目录基本思想利用回溯法解决问题用递归回溯代码框架用迭代回溯代码框架应用举例0-1 背包问题数字全排列回溯法 在最优解,排列组合和解空间搜索中存在典型应用。我们知道动态规划和贪婪算法都要求无后效行,即子问题的解是当前的最优解,不能回退。当这种要求得不到满足时,一种的通常做法是采用回溯的方法进行求解。回溯算法实际上一个类似枚举的搜索尝试过程,主要是在搜索尝试过程中寻找问题的解,当发现已不满足...原创 2019-11-07 11:28:46 · 3684 阅读 · 1 评论 -
剑指offer-题型总结
文章目录数据结构类题目LinkedListTreeStack & QueueHeapHash Table图具体算法类题目搜索算法全排列动态规划回溯排序位运算其他算法数据结构类题目LinkedList003-从尾到头打印链表014-链表中倒数第k个结点015-反转链表016-合并两个或k个有序链表025-复杂链表的复制036-两个链表的第一个公共结点...原创 2019-08-15 20:13:55 · 806 阅读 · 0 评论 -
五大常用算法之-贪心算法
文章目录基本概念贪心算法的基本思路算法存在的问题贪心算法适用的问题贪心选择性质贪心算法的实现框架例题分析应用举例基本概念贪心算法是指,在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑,它所做出的仅仅是在某种意义上的局部最优解。贪心算法没有固定的算法框架,算法设计的关键是贪心策略的选择。必须注意的是,贪心算法不是对所有问题都能得到整体最优解,选择的贪心策略必须具...原创 2019-11-19 20:45:42 · 500 阅读 · 1 评论 -
其他算法-051-构建乘积数组
文章目录题目描述分析代码题目描述给定一个数组A[0,1,...,n−1]A[0,1,...,n-1]A[0,1,...,n−1],请构建一个数组B[0,1,...,n−1]B[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]=A[0]*A[1]*...*A[i-1]*A[i+1]*...原创 2019-12-19 15:37:49 · 192 阅读 · 0 评论 -
其他算法-046-孩子们的游戏-圆圈中最后剩下的数(约瑟夫环)
文章目录题目描述分析代码题目描述每年六一儿童节,牛客都会准备一些小礼物去看望孤儿院的小朋友,今年亦是如此。HF作为牛客的资深元老,自然也准备了一些小游戏。其中,有个游戏是这样的:首先,让小朋友们围成一个大圈。然后,他随机指定一个数m,让编号为0的小朋友开始报数。每次喊到m-1的那个小朋友要出列唱首歌,然后可以在礼品箱中任意的挑选礼物,并且不再回到圈中,从他的下一个小朋友开始,继续0…m-1报数...原创 2019-12-19 14:19:28 · 451 阅读 · 0 评论 -
其他算法-043-左旋转字符串
文章目录题目描述分析代码题目描述汇编语言中有一种移位指令叫做循环左移(ROL),现在有个简单的任务,就是用字符串模拟这个指令的运算结果。对于一个给定的字符序列S,请你把其循环左移K位后的序列输出。例如,字符序列S=”abcXYZdef”,要求输出循环左移3位后的结果,即“XYZdefabc”。是不是很简单?OK,搞定它!分析方法一,移动。把前 length%nlength\%nlengt...原创 2019-12-18 16:41:42 · 174 阅读 · 0 评论 -
其他算法-041-和为S的连续正数序列(滑动窗口思想)
文章目录题目描述分析代码题目描述小明很喜欢数学,有一天他在做数学作业时,要求计算出9~16的和,他马上就写出了正确答案是100。但是他并不满足于此,他在想究竟有多少种连续的正数序列的和为100(至少包括两个数)。没多久,他就得到另一组连续正数和为100的序列:18,19,20,21,22。现在把问题交给你,你能不能也很快的找出所有和为S的连续正数序列?输出所有和为S的连续正数序列。序列内按照...原创 2019-12-18 14:13:04 · 189 阅读 · 0 评论 -
其他算法-042-和为S的两个数字(双指针思想)
文章目录题目描述分析代码题目描述输入一个递增排序的数组和一个数字S,在数组中查找两个数,使得他们的和正好是S,如果有多对数字的和等于S,输出两个数的乘积最小的。输出描述:对应每个测试案例,输出两个数,小的先输出。分析方法一:双层循环,暴力解法,得到所有两数之和,时间复杂度为O(n2n^2n2)。方法二:充分利用数组递增有序的特性,设置两指针到数组的两头,和大了,减小大指针,和小...原创 2019-12-18 10:58:51 · 284 阅读 · 0 评论 -
其他算法-033-丑数
文章目录题目描述分析代码题目描述把只包含质因子2、3和5的数称作丑数(Ugly Number)。例如6、8都是丑数,但14不是,因为它包含质因子7。 习惯上我们把1当做是第一个丑数。求按从小到大的顺序的第N个丑数。分析方法一:暴力搜索,时间复杂度不满足要求。方法二:动态规划方法,当前第n个丑数等于,前n-1个丑数中乘2,乘3,乘5中最小的数,且不再前n-1个丑数之中。代码clas...原创 2019-12-17 13:59:42 · 169 阅读 · 0 评论 -
其他算法-032-把数组排成最小的数
文章目录题目描述分析代码题目描述输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323。分析方法一:乍一看此题似乎是一个全排列问题,当然可以用回溯进行全排列,但是时间复杂度为O(n!).方法二:代码...原创 2019-12-16 19:58:35 · 230 阅读 · 2 评论 -
其他算法-031-整数中1出现的次数(从1到n整数中1出现的次数)
文章目录题目描述分析代码题目描述求出1~13的整数中1出现的次数,并算出100~1300的整数中1出现的次数?为此他特别数了一下1~13中包含1的数字有1、10、11、12、13因此共出现6次,但是对于后面问题他就没辙了。ACMer希望你们帮帮他,并把问题更加普遍化,可以很快的求出任意非负整数区间中1出现的次数(从1 到 n 中1出现的次数)。分析方法一:记录单个数字所包含1的个数,相加...原创 2019-12-10 19:23:18 · 255 阅读 · 0 评论 -
其他算法-028-数组中出现次数超过一半的数字
文章目录题目描述分析代码题目描述数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。如果不存在则输出0。分析方法一:利用python字典,记录每个出现的数字的counter,再遍历得到结果,时间复杂度为O(n),空间复杂度为O(n)。并且此方法可以扩...原创 2019-12-10 16:01:07 · 185 阅读 · 0 评论 -
其他算法-013-调整数组顺序使奇数位于偶数前面
文章目录不考虑相对位置题目描述分析代码考虑相对位置题目描述分析代码不考虑相对位置题目描述输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有奇数位于数组的前半部分,所有偶数位于数组的后半部分。分析使用双指针,利用快排的一次划分思想,很快得到答案。代码# -*- coding:utf-8 -*-class Solution: def reOrderArray(se...原创 2019-12-10 11:55:08 · 174 阅读 · 0 评论 -
其他算法-002-替换空格
文章目录题目描述分析代码题目描述请实现一个函数,将一个字符串中的每个空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy分析思路一:从头到尾遍历字符串做替换,时间复杂度为O(n2),效率低。思路二:从尾到头遍历字符串做替换,时间复杂度为O(n),效率高。利用python str内置`方法,简易解决。时空...原创 2019-12-06 16:30:57 · 192 阅读 · 0 评论 -
位运算-040-数组中只出现一次的数字
文章目录题目描述分析代码原题:260. 只出现一次的数字 III (leetcode)题目描述给定一个整数数组 nums,其中恰好有两个元素只出现一次,其余所有元素均出现两次。 找出只出现一次的那两个元素。示例 : 输入: [1,2,1,3,2,5] 输出: [3,5]注意:结果输出的顺序并不重要,对于上面的例子, [5, 3] 也是正确答案。你的算法应该具有线性时间复杂度。你能...原创 2019-12-03 17:27:48 · 182 阅读 · 0 评论 -
利用位操作进行特殊数组的查找-leetcode
文章目录只出现一次的数字题目描述分析代码只出现一次的数字 II题目描述分析及代码只出现一次的数字原题:136. 只出现一次的数字题目描述给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。说明:你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗?分析利用两个相同正数异或抵消,以及异或具有交换律的性质,数组里所有数字全部异...原创 2019-12-03 15:35:04 · 186 阅读 · 0 评论 -
位运算-012-数值的整数次方
文章目录题目描述分析题目描述给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。保证base和exponent不同时为0。分析解法一: 单层循环,时间复杂度O(abs(exponent))解法二:an={a(n/2)∗a(n/2), n为z(t)=Cci...原创 2019-12-02 18:37:03 · 199 阅读 · 0 评论 -
位运算-011-二进制中1的个数
文章目录题目描述分析代码题目描述输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。分析解法一:python对整数二进制表示,由于它自身语言的特殊性,对负数的二进制表示也是比较特殊的。>>> bin(5)'0b101'>>> bin(-5)'-0b101'>>> bin(-5 & 1)'0b1'&g...原创 2019-12-02 17:32:45 · 314 阅读 · 0 评论 -
二分查找-037-数字在排序数组中出现的次数
文章目录题目描述分析代码题目描述统计一个数字在排序数组中出现的次数。分析在有序数组中的查找,二分查找具有时间复杂度上的优势。这里直接利用二分查找来分别查找目标值的左右边界来确定出现的次数,那么时间复杂度为O(logn)。代码# -*- coding:utf-8 -*-class Solution: def GetNumberOfK(self, data, k): ...原创 2019-11-28 21:50:03 · 366 阅读 · 0 评论 -
二分查找-006-旋转数组的最小数字
文章目录题目描述分析代码题目描述把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素。例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。分析数组部分有序,无重复元素,原题可以理解为查找数组中不大于最后一个元素的最小值,...原创 2019-11-27 21:39:37 · 227 阅读 · 0 评论 -
搜索算法-001-二维数组中的查找
文章目录题目描述分析代码题目描述在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。分析根据二维数组的大小特性:代码# -*- coding:utf-8 -*-class Solution: # array 二维列表 def ...原创 2019-11-21 13:19:40 · 524 阅读 · 0 评论 -
动态规划-067-剪绳子
文章目录题目描述示例分析动态规划贪心算法代码动态规划贪心算法题目描述给你一根长度为n的绳子,请把绳子剪成m段(m、n都是整数,n>1并且m>1),每段绳子的长度记为k[0],k[1],...,k[m]。请问k[0]xk[1]x...xk[m]可能的最大乘积是多少?例如,当绳子的长度是8时,我们把它剪成长度分别为2、3、3的三段,此时得到的最大乘积是18。、示例输入一个数n,意...原创 2019-11-18 13:20:13 · 403 阅读 · 0 评论 -
动态规划-052-正则表达式匹配
文章目录题目描述分析题目描述请实现一个函数用来匹配包括’.‘和’‘的正则表达式。模式中的字符’.‘表示任意一个字符,而’'表示它前面的字符可以出现任意次(包含0次)。 在本题中,匹配是指字符串的所有字符匹配整个模式。例如,字符串"aaa"与模式"a.a"和"ab*ac*a"匹配,但是与"aa.a"和"ab*a"均不匹配分析方法一:动态规划。方法二:分析递归。每次从字符串里取出一...原创 2019-11-15 20:38:17 · 202 阅读 · 0 评论 -
动态规划-030-连续子数组的最大和
文章目录题目描述分析题目描述HZ偶尔会拿些专业问题来忽悠那些非计算机专业的同学。今天测试组开完会后,他又发话了:在古老的一维模式识别中,常常需要计算连续子向量的最大和,当向量全为正数的时候,问题很好解决。但是,如果向量中包含负数,是否应该包含某个负数,并期望旁边的正数会弥补它呢?例如:{6,-3,-2,7,-15,1,2,2},连续子向量的最大和为8(从第0个开始,到第3个为止)。给一个数组,...原创 2019-11-13 16:05:35 · 204 阅读 · 0 评论 -
动态规划-010-矩形覆盖
文章目录题目描述分析题目描述我们可以用2*1的小矩形横着或者竖着去覆盖更大的矩形。请问用n个2*1的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法?分析利用动态规划算法求解此问题:阶段划分,状态表示,状态转移方程:F(n) = F(n-1) + F(n-2) &nbs...原创 2019-11-12 22:03:54 · 430 阅读 · 0 评论 -
动态规划-008-跳台阶
文章目录跳台阶问题题目描述分析代码变态跳青蛙题目描述分析代码跳台阶问题题目描述一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法(先后次序不同算不同的结果)。分析完全同 Fibonacci 数列。确定状态转移公式:阶段定义:跳n阶台阶需要总可能跳法为 f(n)。那调到第n阶台阶的最后一步跳法无非是从第n-1阶台阶跳一步上去的,或者从第n-2阶台...原创 2019-11-12 15:41:19 · 248 阅读 · 0 评论 -
动态规划-007-斐波拉契数列
文章目录题目描述分析代码题目描述大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0)。n<=39分析利用动态规划算法求解此问题:阶段划分,状态表示,状态转移方程:F(n) = F(n-1) + F(n-2)边界条件:F(0) = 0, F(1) = 1.解决此问题的三种方式:递归-时间复杂度 O(2n2^n2n)备忘录...原创 2019-11-12 14:39:05 · 358 阅读 · 0 评论 -
回溯法-066-机器人的运动范围
文章目录题目描述示例分析代码题目描述地上有一个m行和n列的方格。一个机器人从坐标0,0的格子开始移动,每一次只能向左,右,上,下四个方向移动一格,但是不能进入行坐标和列坐标的数位之和大于k的格子。示例例如,当k为18时,机器人能够进入方格(35,37),因为3+5+3+7 = 18。但是,它不能进入方格(35,38),因为3+5+3+8 = 19。请问该机器人能够达到多少个格子?分析依...原创 2019-11-09 20:07:23 · 258 阅读 · 0 评论 -
回溯法-065-矩阵中的路径
文章目录题目描述示例分析代码题目描述请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径。路径可以从矩阵中的任意一个格子开始,每一步可以在矩阵中向左,向右,向上,向下移动一个格子。如果一条路径经过了矩阵中的某一个格子,则该路径不能再进入该格子。示例例如:a b c es f c sa d e e矩阵中包含一条字符串"bcced“的路径,但是矩阵中不包含”a...原创 2019-11-09 17:10:05 · 515 阅读 · 0 评论 -
全排列-027-字符串的排列
文章目录题目描述分析代码题目描述输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。注意:输入一个字符串,长度不超过9(可能有字符重复),字符只包括大小写字母。(去重)分析利用回溯法全排列模板,结果去重,在排字典序。代码# -*- coding:utf-8 -*-...原创 2019-11-20 10:50:16 · 246 阅读 · 0 评论 -
哈希表-034-第一个只出现一次的字符的位置
文章目录题目描述分析代码题目描述在一个字符串(0<=字符串长度<=10000,全部由字母组成)中找到第一个只出现一次的字符,并返回它的位置, 如果没有则返回 -1(需要区分大小写).分析题目简单,利用哈希表,遍历一遍做词频统计,第二遍得结果。也可以利用python str对象计数count方法,但时间复杂度高,运行都可通过。代码使用哈希# -*- coding:utf-...原创 2019-11-05 16:45:13 · 181 阅读 · 0 评论 -
排序-035-数组中的逆序对(冒泡排序)(归并排序)
文章目录题目描述分析代码题目描述在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数P。并将P对1000000007取模的结果输出。 即输出P%1000000007分析寻找数组中的逆序对数,其实问题的实质是数组的排序(冒泡排序以及归并排序),所以衍生出两种解决方式:冒泡排序:交换次数就是逆序对数,换句换说就是交换...原创 2019-10-29 21:49:19 · 1008 阅读 · 0 评论 -
排序-029-最小的K个数(堆排序)(快速排序)
文章目录题目描述分析解题思路一:排序思想解题思路二:快排思想解题思路三:堆排思想代码解题思路一:排序思想解题思路二:快排思想解题思路三:堆排思想题目描述输入n个整数,找出其中最小的K个数。例如输入 4,5,1,6,2,7,3,8 这8个数字,则最小的4个数字是 1,2,3,4 。分析解题思路一:排序思想思路: 按照升序排序,然后取前K个数,就是我们最终想要的到的结果,现在较好一点的排序...原创 2019-10-31 13:05:16 · 743 阅读 · 2 评论 -
队列和栈-064-滑动窗口的最大值(双端队列)
文章目录题目描述分析题目描述给定一个数组和滑动窗口的大小,找出所有滑动窗口里数值的最大值。例如,如果输入数组{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-10-26 14:32:50 · 356 阅读 · 0 评论 -
队列和栈-044-翻转单词顺序列(栈)
文章目录题目描述分析代码题目描述牛客最近来了一个新员工Fish,每天早晨总是会拿着一本英文杂志,写些句子在本子上。同事Cat对Fish写的内容颇感兴趣,有一天他向Fish借来翻看,但却读不懂它的意思。例如,“student. a am I”。后来才意识到,这家伙原来把句子单词的顺序翻转了,正确的句子应该是“I am a student.”。Cat对一一的翻转这些单词顺序可不在行,你能帮助他么?...原创 2019-10-25 15:09:20 · 375 阅读 · 0 评论 -
队列和栈-021-栈的压入、弹出序列
文章目录题目描述分析代码题目描述输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。(注意:这两个序列的长度是相等的)分析借用一个辅助的栈,遍历压栈顺序,先讲第一个放入栈中,这...原创 2019-10-23 21:31:04 · 325 阅读 · 0 评论 -
队列和栈-020-包含min函数的栈
文章目录题目描述分析代码题目描述定义栈的数据结构,请在该类型中实现一个能够得到栈中所含最小元素的min函数(时间复杂度应为O(1))分析使用一个辅助栈,用来存储当前栈中的最小值,辅助栈中元素数量和原始栈一样多。每次入栈时,将入栈元素与辅助栈顶元素相比较,如果该元素较小,则将该元素也入辅助栈,否则将辅助栈顶元素再入辅助栈一次。出栈时,辅助栈也要出栈。即保持辅助栈顶元素为当前栈的最小元素值。...原创 2019-10-23 20:21:09 · 144 阅读 · 0 评论 -
队列和栈-用两个队列实现栈
文章目录题目描述分析代码题目描述用两个队列实现一个栈。思考用两个栈实现一个队列。两个栈实现一个队列分析队列1 :queue1队列2 :queue2进栈操作:元素入空队列1出栈操作:判断如果队列1只有一个元素,则直接出队。否则,把队1中的元素出队并入队2,直到队1中只有一个元素,再直接出队。为了下一次继续操作,互换队1和队2。代码class Stock...原创 2019-10-21 15:05:40 · 180 阅读 · 0 评论