
剑指offer
zjwreal
这个作者很懒,什么都没留下…
展开
-
十大排序算法
文章目录0、算法概述0.1 算法分类0.2 算法复杂度1 冒泡排序(Bubble Sort)1.1 算法描述2 选择排序(Selection Sort)2.1 算法描述3 插入排序(Insertion Sort)3.1 算法描述4 希尔排序(Shell Sort)4.1 算法描述5 归并排序(Merge Sort)5.1 算法描述6 快速排序(Quick Sort)6.1 算法描述7 堆排序(He...原创 2019-08-11 13:01:31 · 676 阅读 · 0 评论 -
【剑指offer】数组中重复的数字
题目描述在一个长度为n的数组里的所有数字都在0到n-1的范围内。 数组中某些数字是重复的,但不知道有几个数字是重复的。也不知道每个数字重复几次。请找出数组中任意一个重复的数字。 例如,如果输入长度为7的数组{2,3,1,0,2,5,3},那么对应的输出是第一个重复的数字2。代码class Solution {public: // Parameters: // ...原创 2019-04-06 11:54:15 · 236 阅读 · 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]=∏j=0n−1A[j]/A[i]B[i] = \prod_{j=0}^{n-1} A[j] /A[i]B[i]=∏j=0n−1...原创 2019-04-06 12:28:30 · 112 阅读 · 0 评论 -
【剑指offer】正则表达式匹配(字符串)
题目描述请实现一个函数用来匹配包括’.‘和’ * ‘的正则表达式。模式中的字符’.‘表示任意一个字符,而’ * '表示它前面的字符可以出现任意次(包含0次)。 在本题中,匹配是指字符串的所有字符匹配整个模式。例如,字符串"aaa"与模式"a.a"和"abaca"匹配,但是与"aa.a"和"ab*a"均不匹配思路这道题的难点在于对于模式中 * 字符的状态转换要考虑全:例如对于’ . * ’ ...原创 2019-04-06 14:08:19 · 1169 阅读 · 0 评论 -
【剑指offer】数组中只出现一次的数字(位运算)
题目描述一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。思路将该问题简化:一个整型数组里除了1个数字之外,其他的数字都出现了两次。找出这两个只出现一次的数字。注意两个相同的数字通过异或运算,结果为0;而任何数与0进行异或得到其本身;异或运算满足交换律、结合律;所以结果与运算顺序无关;将数组中所有数字进行异或,可以得到只出现一次的数字然后回归...原创 2019-03-28 14:38:54 · 186 阅读 · 0 评论 -
【剑指offer】表示数值的字符串(字符串)
题目描述请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。例如,字符串"+100",“5e2”,"-123",“3.1416"和”-1E-16"都表示数值。 但是"12e",“1a3.14”,“1.2.3”,"±5"和"12e+4.3"都不是。思路表示数值的字符串遵循模式 A[.[B]][e|EC] 或者.[B][e|EC] ,其中A为数值的整数部分,B为小数点后数值的小数部分,C...原创 2019-04-08 10:30:31 · 126 阅读 · 0 评论 -
【剑指offer】二叉树的下一个结点(二叉树)
题目描述给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针。思路分为两种情况(1)该节点有右子树找到右子树最左节点(2)该节点无右子树从下向上找父节点:找到这么一个节点,该节点是其父节点的左子节点,返回该节点注意:根节点的父节点为空代码/*struct TreeLinkNode { in...原创 2019-04-13 13:51:28 · 119 阅读 · 0 评论 -
【剑指offer】对称的二叉树(二叉树)
题目描述请实现一个函数,用来判断一颗二叉树是不是对称的。注意,如果一个二叉树同此二叉树的镜像是同样的,定义其为对称的思路定义一种遍历算法,先遍历右子节点再遍历左子节点;如对称先序遍历:根节点-》右子节点=》左子节点而先序遍历:根节点-》左子节点-》右子节点通过比较二叉树的先序遍历和对称先序遍历的序列是否相同来判断二叉树是否对称。注意:因为二叉树的元素可能全部相同,所以将遍历过程中的nu...原创 2019-04-13 15:08:44 · 202 阅读 · 0 评论 -
【剑指offer】把二叉树打印成多行(二叉树)
题目描述从上到下按层打印二叉树,同一层结点从左至右输出。每一层输出一行。思路与二叉树的层序遍历相同,区别在于需要逐层打印;所以需要加入两个参数来控制:toBePrinted表示当前层还没打印的节点数,nextLevel表示下一层需要打印的节点数。当每一层打印完时(toBePrinted==0),将当前层打印的序列存下来,并更新需要打印的节点数为下一层需要打印的节点数更新 toBePrint...原创 2019-04-13 16:00:30 · 97 阅读 · 0 评论 -
【剑指offer】链表中环的入口结点(链表)
题目描述给一个链表,若其中包含环,请找出该链表的环的入口结点,否则,输出null。思路(1)判断是否有环存在设置快慢指针,快指针一次走2步,慢指针一次走1步;当快指针=null时说明没有环存在;如果有环存在,则必然有快指针追上慢指针(2)当快指针追上慢指针后,此时必然位于环之内。然后通过再走一圈环,得到环的长度r(3)类似题目“链表倒数第k个节点”,通过设计两个指针来遍历。前一个指针先...原创 2019-03-27 14:25:20 · 115 阅读 · 0 评论 -
【剑指offer】平衡二叉树(二叉树)
题目描述输入一棵二叉树,判断该二叉树是否是平衡二叉树。思路类似上一题求树的深度,但是如果每次都要求树的深度,则会反复计算相同的节点。如果子树不平衡,直接返回否。注意:子树深度的返回值可以用特定值-1来表示不平衡,而正数表示子树深度代码class Solution {public: // 返回值:树的深度 bool IsBalanced_Solution(TreeNod...原创 2019-03-27 00:14:42 · 142 阅读 · 0 评论 -
【剑指offer】求1+2+3+...+n(位运算+递归)
题目描述求1+2+3+…+n,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)。代码class Solution {public: int Sum_Solution(int n) { int ret = n; // 利用前一个判断短路;当n=0时,不进行后一个判断的计算,作为递归终止...原创 2019-03-30 19:43:27 · 257 阅读 · 0 评论 -
【剑指offer】不用加减乘除做加法
题目描述写一个函数,求两个整数之和,要求在函数体内不得使用+、-、*、/四则运算符号。思路使用位运算:异或计算得到两个数不带进位的和,位与计算得到进位的位置,再循环求和;直到进位为0代码class Solution {public: int Add(int num1, int num2){ int sum, carry; do{ ...原创 2019-03-30 19:57:40 · 91 阅读 · 0 评论 -
【剑指offer】把字符串转换成整数
题目描述将一个字符串转换成一个整数(实现Integer.valueOf(string)的功能,但是string不符合数字要求时返回0),要求不能使用字符串转换整数的库函数。 数值为0或者字符串不是一个合法的数值则返回0。输入描述:输入一个字符串,包括数字字母符号,可以为空输出描述:如果是合法的数值表达则返回该数字,否则返回0示例1输入+2147483647 1a33输出...原创 2019-03-30 20:38:37 · 127 阅读 · 0 评论 -
【剑指offer】删除链表中重复的节点(链表)
题目描述在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5思路要把当前节点的前一个节点(pPre)和后面值比当前节点的值大的节点项链,确保pPre始终与下一个没有重复的节点连接在一起注意:头结点也可能被删除代码clas...原创 2019-03-30 21:53:20 · 92 阅读 · 0 评论 -
【剑指offer】数组中的逆序对(排序)
题目描述在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数P。并将P对1000000007取模的结果输出。 即输出P%1000000007输入描述:题目保证输入的数组中没有的相同的数字数据范围:对于%50的数据,size<=10^4对于%75的数据,size<=10^5对于%100的数据,si...原创 2019-03-23 22:09:27 · 314 阅读 · 0 评论 -
【剑指offer】两个链表的第一个公共结点(链表)
题目描述输入两个链表,找出它们的第一个公共结点。思路公共节点指的是节点的指针相同(节点本身相同),而不是节点的内容相同。如果考虑暴力的方法,对于链表1的每个元素,去遍历链表2,找出第一个公共节点,这样时间复杂度为O(mn),计算开销大;(m,n分别为两个链表的长度)考虑具有公共节点的链表的特征:如果两个链表有公共节点,则两个链表会形成“Y”的形状,在公共节点后,两个链表是相同的。(1)...原创 2019-03-24 10:39:37 · 149 阅读 · 0 评论 -
【剑指offer】数字在排序数组中出现的次数(查找)
题目描述统计一个数字在排序数组中出现的次数。思路查找有序数组,首先考虑使用二分查找,使时间复杂度为O(log n)。更改二分查找的条件,不断缩小区间,直到区间头和区间尾均为k时停止,计算得到区间长度。代码class Solution {public: // 二分查找 O(log n) int GetNumberOfK(vector<int> data ,int k)...原创 2019-03-24 11:13:34 · 295 阅读 · 0 评论 -
【剑指offer】二叉树的深度(二叉树)
题目描述输入一棵二叉树,求该树的深度。从根结点到叶结点依次经过的结点(含根、叶结点)形成树的一条路径,最长路径的长度为树的深度。思路深度优先搜索,每次得到左右子树当前最大路径,选择其中较大者并回溯。代码class Solution {public: int TreeDepth(TreeNode* pRoot){ if (pRoot == nullptr) ...原创 2019-03-24 11:40:39 · 122 阅读 · 0 评论 -
【剑指offer】按之字形顺序打印二叉树(二叉树)
题目描述请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推。思路【1】同上一题分层打印二叉树相似,区别在于用一个变量控制打印的方向,每一层遍历的时候还是用队列存储进行层次遍历,只有最后打印时判断是否需要翻转。缺点:偶数层打印时需要翻转当前序列/*struct TreeNode { int...原创 2019-04-13 16:58:28 · 183 阅读 · 0 评论 -
【剑指offer】序列化二叉树(二叉树)
题目描述请实现两个函数,分别用来序列化和反序列化二叉树思路将问题分解为左子树、根节点、右子树分别进行递归处理。序列化是从根开始的,那么对应的反序列化在根节点的先序遍历中就可以得到。用’#'表示遍历过程中的nullptr,通过先序遍历得到序列。如:0,1,3,###2,4,##5,##反序列化:如上式,首先得到数字0,作为根节点;然后得到数字1,是根节点的左子节点,接着得到3,是1的左...原创 2019-04-13 21:02:38 · 106 阅读 · 0 评论 -
【剑指offer】0到n-1中缺失的数字(二分查找)
题目描述一个长度为n-1的递增排序数组中的所有数字都是唯一的,并且每个数字都在范围0~n-1之内。在范围0~n-1内的n个数字中有且只有一个数字不在该数组中,请找出这个数字。思路对于排序数字中查找,肯定考虑用二分查找最高效,时间复杂度为O(log n)。我们假设不在数组中的那个数字记为m,那么所有m小的数字的下标都与它们对应位置的值相同。由于m不在数组中,所以m+1处在下标为m的位置,m+2...原创 2019-06-05 21:55:04 · 462 阅读 · 0 评论 -
【剑指offer】数组中数值和下标相等的元素(二分查找)
题目描述假设一个单调递增的数组里的每个元素都是整数并且是唯一的。请编写实现一个函数,找出数组中任意一个数值等于其下标的元素。例如,在数组{-3,-1,1,3,5}中,数字3和它的下标相等。思路二分查找,时间复杂度O(log n)代码class Solution {public: int getNumberSameAsIndex(vector<int> nums){...原创 2019-06-05 22:02:31 · 339 阅读 · 0 评论 -
二叉树的层序、先序、中序、后序遍历(递归、非递归方式)
二叉树定义struct TreeNode { int val; TreeNode *left; TreeNode *right; TreeNode(int x) : val(x), left(NULL), right(NULL) {}};遍历结果int main(){ /* * 1 * / \ * ...原创 2019-05-29 16:05:35 · 710 阅读 · 0 评论 -
TopK问题详解
题目描述面试中经常会问到的一道题目:从n个未排序的数中得到的最大的k个数,称为TopK问题。(最小的k个数做法也相似)基于partition函数基于快速排序中的partition函数,时间复杂度为O(n),空间复杂度为O(1);需要改变输入;(1)根据Partition函数得到索引值index,index前的数据均小于nums[index],index后的数据均大于nums[index]...原创 2019-05-29 17:22:30 · 6257 阅读 · 2 评论 -
【剑指offer】完全二叉树最后一层的最右节点(二叉树,二分查找)
题目给定一棵完全二叉树,返回最后一层的最右边的节点。思路层次遍历,用一个last变量记录每次出队列的值,遍历结束之后last变量记录的就是所求节点。时间、空间复杂度都是O(N)。递归,求子树的高度:如果当前根节点为叶子节点,则返回;如果左子树高度>右子树高度,则在左子树继续递归过程;否则在右子树继续递归。由于是完全二叉树,求高度时只需一直往左遍历即可。每次递归都下降一层,每次都求树的...原创 2019-07-15 21:57:41 · 3561 阅读 · 0 评论 -
二叉树Morris遍历方法(时间复杂度O(n)空间复杂度O(1))
#include <iostream>#include <bits/stdc++.h>using namespace std;struct TreeNode { int val; TreeNode *left; TreeNode *right; TreeNode(int x) : val(x), left(NULL), right(...原创 2019-07-25 14:53:08 · 602 阅读 · 0 评论 -
最长公共子串(动态规划)
#include <iostream>#include <bits/stdc++.h>using namespace std;/* * 最长公共子串问题-动态规划 * dp[i][j]表示在必须将str1[i-1]和str2[j-1]作为公共子串最后一个字符的情况下,公共子串最大长度 * dp[i][j]取决于dp[i-1][j], dp[i][j-1], d...原创 2019-08-04 19:08:49 · 307 阅读 · 0 评论 -
最长公共子序列(动态规划)
#include <iostream>#include <bits/stdc++.h>using namespace std;/* * 最长公共子序列-动态规划 * dp[i][j]表示str1前i子串和str2前j子串的最长公共子序列长度 * dp[i][j]取决于dp[i-1][j], dp[i][j-1], dp[i-1][j-1] * 时间复杂度O(...原创 2019-08-04 19:09:46 · 744 阅读 · 0 评论 -
【剑指offer】在排序数组中查找数字(二分查找)
题目描述统计一个数字在排序数组中出现的次数。例如,对排序数组{1,2,3,3,3,3,4,5}和数字3,由于3在这个数组中出现了4次,因此输出4。思路对于排序数组中查找,首先考虑使用二分查找。该题目要求统计元素出现的次数,则可以分解以下步骤:(1)找到该元素在排序数组中最左边的位置leftIndex(2)找到该元素在排序数组中最右边的位置rightIndex(3)计算得到出现次数为ri...原创 2019-06-05 17:12:52 · 331 阅读 · 0 评论 -
【剑指offer】最长不包含重复字符的子字符串(动态规划)
题目描述请从字符串中找出一个最长的不包含重复字符的子字符串,计算该最长子字符串的长度。假设字符串中只包含’a’~'z’的字符。例如,在字符串"arabcacfr"中,最长的不包含重复字符的子字符串是"acfr",长度为4。思路如果使用暴力方法,找到所有字符串的子字符串,然后就可以判断每个子字符串中是否包含重复的字符。一个长度为n的字符串有O(n^2)个子字符串,并且需要O(n)的时间判断子字...原创 2019-06-05 16:30:47 · 1395 阅读 · 0 评论 -
【剑指offer】二叉搜索树的第k个结点(二叉树)
题目描述给定一棵二叉搜索树,请找出其中的第k小的结点。例如, (5,3,7,2,4,6,8) 中,按结点数值大小顺序第三小结点的值为4。思路对于二叉搜索树,使用中序遍历就能得到排序好的序列;每次访问一个节点,计数-1;直到计数为0时返回。代码/*struct TreeNode { int val; struct TreeNode *left; struct...原创 2019-04-13 21:45:05 · 222 阅读 · 0 评论 -
【剑指offer】数据流中的中位数(数组)
题目描述如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值。如果从数据流中读出偶数个数值,那么中位数就是所有数值排序之后中间两个数的平均值。我们使用Insert()方法读取数据流,使用GetMedian()方法获取当前读取数据的中位数。思路用一个最大堆和一个最小堆实现。插入效率为O(logN),查找效率为O(1)。最大堆的元素数不少于最...原创 2019-04-13 22:44:43 · 198 阅读 · 0 评论 -
【剑指offer】滑动窗口的最大值(数组)
题目描述给定一个数组和滑动窗口的大小,找出所有滑动窗口里数值的最大值。例如,如果输入数组{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-14 12:42:57 · 273 阅读 · 0 评论 -
【剑指offer】矩阵中的路径(二维数组,二分查找)
题目描述请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径。路径可以从矩阵中的任意一个格子开始,每一步可以在矩阵中向左,向右,向上,向下移动一个格子。如果一条路径经过了矩阵中的某一个格子,则之后不能再次进入这个格子。 例如 a b c e s f c s a d e e 这样的3 X 4 矩阵中包含一条字符串"bcced"的路径,但是矩阵中不包含"abcb"路径,因为字符...原创 2019-04-14 12:43:52 · 268 阅读 · 0 评论 -
【剑指offer】队列的最大值(队列)
题目描述定义一个队列并实现函数max得到队列里的最大值,要求函数max、push_back和pop_front的时间复杂度都是O(1)思路实现带max函数的队列;使用双头队列实现。总共使用2个队列,一个队列用来存储正常的队列元素,另一个双头队列用来存储可能成为最大值的元素,其中双头队列的队列头表示当前队列的最大值,O(1)时间得到。(1)每次加入一个新元素,从双头队列中从后往前找,删除比...原创 2019-04-14 13:04:04 · 611 阅读 · 0 评论 -
【剑指offer】机器人的运动范围(回溯)
题目描述地上有一个m行和n列的方格。一个机器人从坐标0,0的格子开始移动,每一次只能向左,右,上,下四个方向移动一格,但是不能进入行坐标和列坐标的数位之和大于k的格子。 例如,当k为18时,机器人能够进入方格(35,37),因为3+5+3+7 = 18。但是,它不能进入方格(35,38),因为3+5+3+8 = 19。请问该机器人能够达到多少个格子?代码class Solution {pu...原创 2019-04-14 14:25:15 · 75 阅读 · 0 评论 -
【剑指offer】把数字翻译成字符串(动态规划)
题目描述给定一个数字,我们按照如下规则把它翻译成字符串:0翻译成"a",1翻译成"b",。。。,11翻译成"l",。。。,25翻译成"z"。一个数字可能有多个翻译。例如,12258有5种不同的翻译,分别是bccfi、bwfi、bczi、mcfi和mzi。请编程实现一个函数,用来计算一个数字有多少种不同的翻译方法。思路这是一个典型的递归问题,我们定义函数 f(i) 表示从第0位数字开始到第i位...原创 2019-06-05 15:01:02 · 500 阅读 · 0 评论 -
【剑指offer】礼物的最大价值(动态规划)
题目描述在一个 m*n 的七品的每一格都放有一个礼物,每个礼物都有一定的价值(价值大于0)。你可以从七品的左上角开始拿格子里的礼物,并每次向右或向下移动一格,知道到达棋盘的右下角。给定一个棋盘及其上面的礼物,请计算你最多能拿到多少价值的礼物?例如,在下面的七品中,如果沿着带下划线的数字的线路(1,12,5,7,7,16,5),那么我们能拿到最大价值为53的礼物。思路这是一个典型的能用动态...原创 2019-06-05 15:49:28 · 498 阅读 · 0 评论 -
【剑指offer】圆圈中最后剩下的数字(链表,递归)
题目描述0,1,…,n-1这n个数字排成一个圆圈,从数字0开始,每次从这个圆圈里删除第m个数字。求出这个圆圈里剩下的最后一个数字思路考虑用环形链表解决;用stl中的list来模拟环形链表注意:list本身不是环形结构,所以每当迭代器扫描到链表末尾时,需要把迭代器移到链表的头部list的erase方法删除节点后,原来的迭代器会失效,所以需要保存下一个节点代码class Solutio...原创 2019-03-30 18:52:40 · 180 阅读 · 0 评论