
剑指offer
giaming023
我很懒,没有简介
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
矩形覆盖
题目链接题目描述我们可以用2*1的小矩形横着或者竖着去覆盖更大的矩形。请问用n个2*1的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法?解题思路类似于青蛙跳台阶,当n=1时,只有一种横向排列的方式。当n等于二时,22有两种选择,横向或者是竖向。当n等于3的时候对于23来说,如果选择的是竖向排列,则剩下的就是22排列,如果选择的是横向,则对于2n剩下的则只有1*n的一种选择。所以依次...原创 2019-03-02 21:23:36 · 147 阅读 · 0 评论 -
斐波那契数列
题目链接题目描述大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0)。n<=39解题思路由于递归运算会遇到重复计算问题,导致时间复杂度增加,因此这里采用利用一个数组保存0~39的斐波那契数列值,然后返回需要的斐波那契数列的值。class Solution {public: int Fibonacci(int n) { ...原创 2019-02-27 12:03:37 · 130 阅读 · 0 评论 -
跳台阶
题目链接题目描述一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法(先后次序不同算不同的结果)。解题思路f(1) = 1, f(2) = 2, f(3) = 3, f(4) = 5, 可以总结出f(n) = f(n-1) + f(n-2)的规律。class Solution {public: int jumpFloor(int numbe...原创 2019-02-27 12:04:08 · 140 阅读 · 0 评论 -
变态跳台阶
题目链接题目描述一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。解题思路我们先梳理几个底层有多少种跳法:1层台阶, 1 1种2层台阶,11,2 2种3层台阶,111,12,21,3 4种4层台阶,1111,112,121,13,211,22,31,4 8种5层台阶,11111,1112,1121,113,1211,12...原创 2019-02-27 12:04:43 · 126 阅读 · 0 评论 -
矩形覆盖
题目链接题目描述我们可以用2*1的小矩形横着或者竖着去覆盖更大的矩形。请问用n个2*1的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法?解题思路类似于青蛙跳台阶,当n=1时,只有一种横向排列的方式。当n等于二时,22有两种选择,横向或者是竖向。当n等于3的时候对于23来说,如果选择的是竖向排列,则剩下的就是22排列,如果选择的是横向,则对于2n剩下的则只有1*n的一种选择。所以依次...原创 2019-02-27 12:05:41 · 145 阅读 · 0 评论 -
调整数组顺序使奇数位于偶数前面
题目链接题目描述输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。解题思路class Solution {public: void reOrderArray(vector<int> &array) { vector<int...原创 2019-03-06 15:22:32 · 119 阅读 · 0 评论 -
链表中的倒数第k个结点
题目链接题目描述输入一个链表,输出该链表中倒数第k个结点解题思路先将链表遍历一遍,记录链表的长度值,然后用链表长度减去k值,还需要判断结果是否大于0,若大于0的话,返回倒数第k个结点,否则返回NULL/*struct ListNode { int val; struct ListNode *next; ListNode(int x) : val(x), next(NULL)...原创 2019-03-06 15:23:09 · 146 阅读 · 0 评论 -
链表中环的入口结点
题目链接题目描述给一个链表,若其中包含环,请找出该链表的环的入口结点,否则,输出null。解题思路使用双指针,一个指针fast每次移动两个结点,一个指针slow每次移动一个结点。因为存在环,所以两个指针必定相遇在环中的某个结点上。此时fast移动的结点数位x+2y+z,slow为x+y,由于fast速度比slow快一倍,因此x+2y+z=2(x+y),得到x=z;在相遇点,slow要到...原创 2019-03-06 15:23:50 · 98 阅读 · 0 评论 -
反转链表
题目链接题目描述输入一个链表,反转链表后,输出新链表的表头。解题思路使用递归实现:/*struct ListNode { int val; struct ListNode *next; ListNode(int x) : val(x), next(NULL) { }};*/class Solution {public: ListNode* ReverseLi...原创 2019-03-06 15:24:24 · 119 阅读 · 0 评论 -
合并两个排序的链表
题目链接题目描述输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。解题思路/*struct ListNode { int val; struct ListNode *next; ListNode(int x) : val(x), next(NULL) { }};*/class Solution {public: Lis...原创 2019-03-06 15:24:55 · 120 阅读 · 0 评论 -
树的子结构
题目链接题目描述输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)解题思路递归遍历:/*struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right; TreeNode(int x) : val(x), left(NULL), right(NULL)...原创 2019-03-06 15:25:27 · 156 阅读 · 0 评论 -
二叉树的镜像
题目链接题目描述操作给定的二叉树,将其变换为源二叉树的镜像。二叉树的镜像定义:源二叉树 8 / \ 6 10 / \ / \ 5 7 9 11 镜像二叉树 8 / \ 10 6 / \ / \ 11 9 7 5解题思路...原创 2019-03-06 15:25:54 · 107 阅读 · 0 评论 -
对称的二叉树
题目链接题目描述请实现一个函数,用来判断一颗二叉树是不是对称的。注意,如果一个二叉树同此二叉树的镜像是同样的,定义其为对称的。解题思路/*struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right; TreeNode(int x) : val(x)...原创 2019-03-06 15:26:21 · 116 阅读 · 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.解题思路class Solution {public: vector<int> pr...原创 2019-03-06 15:26:57 · 116 阅读 · 0 评论 -
包含min函数的栈
题目链接题目描述定义栈的数据结构,请在该类型中实现一个能够得到栈中所含最小元素的min函数(时间复杂度应为O(1))。解题思路#include<cmath>class Solution {public: void push(int value) { stack.push(value); minStack.push(minStack.e...原创 2019-03-06 15:27:23 · 124 阅读 · 0 评论 -
用两个栈实现队列
题目链接题目描述用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型。解题思路in 栈用来处理入栈(push)操作,out 栈用来处理出栈(pop)操作。一个元素进入 in 栈之后,出栈的顺序被反转。当元素要出栈时,需要先进入 out 栈,此时元素出栈顺序再一次被反转,因此出栈顺序就和最开始入栈顺序是相同的,先进入的元素先退出,这就是队列的顺序。class...原创 2019-02-27 12:03:07 · 140 阅读 · 0 评论 -
二叉树的下一个结点
题目链接题目描述给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针。解题思路如果一个结点的右子树不为空,那么该节点的下一个节点是右子树的最左节点,否则,向上找第一个左链接指向的树包含该节点的祖先节点。/*struct TreeLinkNode { int val; struct Tree...原创 2019-02-27 12:02:38 · 137 阅读 · 0 评论 -
重建二叉树
题目链接题目描述输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。解题思路前序遍历第一个值为根节点的值,使用这个值将中序遍历分为两部分,左部分为左子树遍历的结果,右部分为右子树遍历的结果,递归实现建立树。...原创 2019-02-27 12:01:53 · 120 阅读 · 0 评论 -
旋转数组的最小数字
题目链接题目描述把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。 输入一个非减排序的数组的一个旋转,输出旋转数组的最小元素。 例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。 NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。解题思路采用的是二分查找的思路。class Solution {public: int ...原创 2019-03-02 21:24:12 · 127 阅读 · 0 评论 -
矩阵中的路径
题目链接题目描述请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径。路径可以从矩阵中的任意一个格子开始,每一步可以在矩阵中向左,向右,向上,向下移动一个格子。如果一条路径经过了矩阵中的某一个格子,则之后不能再次进入这个格子。 例如 a b c e s f c s a d e e 这样的3 X 4 矩阵中包含一条字符串"bcced"的路径,但是矩阵中不包含"abcb"路径...原创 2019-03-02 21:24:54 · 135 阅读 · 0 评论 -
机器人的运动范围
题目链接题目描述地上有一个m行和n列的方格。一个机器人从坐标0,0的格子开始移动,每一次只能向左,右,上,下四个方向移动一格,但是不能进入行坐标和列坐标的数位之和大于k的格子。 例如,当k为18时,机器人能够进入方格(35,37),因为3+5+3+7 = 18。但是,它不能进入方格(35,38),因为3+5+3+8 = 19。请问该机器人能够达到多少个格子?解题思路核心思路:1.从(0,...原创 2019-03-02 21:25:36 · 151 阅读 · 0 评论 -
剪绳子
题目链接题目描述一根绳子剪成多段,并且使得每段的长度乘积最大。For example, given n = 2, return 1 (2 = 1 + 1); given n = 10, return 36 (10 = 3 + 3 + 4).解题思路class Solution {public: long long integerBreak(long long n) { ...原创 2019-03-02 21:26:13 · 157 阅读 · 0 评论 -
二进制中1的个数
题目链接题目描述输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。解题思路把一个整数减去1,再和原整数做与运算,会把该整数最右边一个1变成0。那么一个整数的二进制表示中有多少个1,就可以进行多少次这样的操作。PS:把一个整数减去1之后再和原来的整数做位与运算,得到的结果相当于是把整数的二进制表示中的最右边一个1变成0。很多二进制的问题都可以用这个思路解决。class ...原创 2019-03-02 21:27:03 · 136 阅读 · 0 评论 -
数值的整数次方
题目链接题目描述给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。解题思路因为xn=(x*x)(n/2),可以通过递归求解,并且每递归依次,n都减小一半,因此整个算法的时间复杂度为O(logn)class Solution {public: double Power(double base, int exponent)...原创 2019-03-02 21:27:44 · 144 阅读 · 0 评论 -
打印从1到最大的n位数
题目描述输入数字 n,按顺序打印出从 1 最大的 n 位十进制数。比如输入 3,则打印出 1、2、3 一直到最大的 3 位数即999。解题思路用于n可能会非常大,因此不能直接用int表示数字,而是用char数组进行存储使用回溯法得到所有的数。#include<iostream>using namespace std;void print1ToMaxN(const int...原创 2019-03-02 21:28:36 · 161 阅读 · 0 评论 -
删除链表中重复的结点
题目链接题目描述在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5解题思路使用递归删除/*struct ListNode { int val; struct ListNode *next; Li...原创 2019-03-02 21:29:19 · 118 阅读 · 0 评论 -
正则表达式匹配
题目链接题目描述请实现一个函数用来匹配包括’.‘和’‘的正则表达式。模式中的字符’.‘表示任意一个字符,而’'表示它前面的字符可以出现任意次(包含0次)。 在本题中,匹配是指字符串的所有字符匹配整个模式。例如,字符串"aaa"与模式"a.a"和"abaca"匹配,但是与"aa.a"和"ab*a"均不匹配解题思路如果模式串此时是’.’,那么只需要模式和匹配串都往后移动一个位置即可如果现在这...原创 2019-03-02 21:29:58 · 501 阅读 · 0 评论 -
表示数值的字符串
题目链接题目描述请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。例如,字符串"+100",“5e2”,"-123",“3.1416"和”-1E-16"都表示数值。 但是"12e",“1a3.14”,“1.2.3”,"±5"和"12e+4.3"都不是。解题思路可以利用正则表达式来实现。思路:需要满足一下规则(正则表达式,直接用理解困难)1 e/E后面必须跟数字,且只能原创 2019-03-02 21:30:52 · 130 阅读 · 0 评论 -
数组中重复数字
题目链接题目描述在一个长度为n的数组里的所有数字都在0到n-1的范围内。 数组中某些数字是重复的,但不知道有几个数字是重复的。也不知道每个数字重复几次。请找出数组中任意一个重复的数字。 例如,如果输入长度为7的数组{2,3,1,0,2,5,3},那么对应的输出是第一个重复的数字2。要求复杂度为 O(N) + O(1),也就是时间复杂度 O(N),空间复杂度 O(1)。因此不能使用排序的方法,...原创 2019-02-27 11:56:29 · 158 阅读 · 0 评论 -
二维数组中的查找
题目链接题目描述在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。Consider the following matrix:[[1, 4, 7, 11, 15],[2, 5, 8, 12, 19],[3, 6, 9, 16, 22],[10...原创 2019-02-27 11:58:48 · 142 阅读 · 0 评论 -
替换空格
题目链接题目描述请实现一个函数,将一个字符串中的每个空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。解题思路在字符串尾部填充任意字符,使得字符串的长度等于字符串替换之后的长度。因为一个空格要替换成三个字符(%20),因此当遍历到一个空格时,需要在尾部填充两个任意字符。先遍历字符串数组,变量blankNum记录空格的...原创 2019-02-27 12:00:10 · 151 阅读 · 0 评论 -
从尾到头打印链表
题目链接题目描述输入一个链表,按链表值从尾到头的顺序返回一个ArrayList。解题思路将链表中的元素依次保存到array1中,然后在将array1中的元素倒序输入到array2中,即可实现对链表的从尾到头打印。/*** struct ListNode {* int val;* struct ListNode *next;* ListN...原创 2019-02-27 12:01:09 · 130 阅读 · 0 评论 -
栈的压入、弹出序列
题目链接题目描述输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。(注意:这两个序列的长度是相等的)解题思路1.建立一个辅助栈,将栈的压入序列压入到辅助栈中2.压入一个元素...原创 2019-03-06 15:27:55 · 132 阅读 · 0 评论