
剑指offer刷题专栏
剑指offer中的C++实现
haha and giraffe
一只努力的长颈鹿
展开
-
剑指offer——删除链表中的节点
题目1:在O(1)内删除链表节点。给定单向链表的头指针和一个节点的指针,在规定时间复杂度内删除该节点 解题思路:首先在时间复杂度O(1)就不可能从头遍历链表查找节点。我们把下一个要删除节点的下一个节点的值赋值给指定的节点,然后删除下一个节点即可,再改变一下next指针的指向即可。 具体代码如下: #include <iostream> using namespace std; ...原创 2019-01-04 11:30:44 · 307 阅读 · 0 评论 -
剑指offer——打印从1到最大的n位数
题目:输入数字n,按顺序打印出从1到最大的n位十进制数。 解题思路:首先要想到这是一道大数题,用字符串存储每一位数字,然后要想到利用每一位的全排列来递归求解。从最后一位开始。若n=2,则字符串大小为3,str[2]='\0',分别从01,02,03 ...,99。所以利用递归每次index=3时,就可以打印。打印的时候要注意把字符串前面的0去掉。 #include <stdio.h&g...原创 2018-12-30 22:37:16 · 137 阅读 · 0 评论 -
剑指offer——剪绳子
题目描述:有一个长度为n的绳子,请把绳子剪成m段(m、n都是整数,n>1且m>1)每段绳子的长度记为k[0]、k[1]...k[m-1],求每一段相乘最大为多少? 解题思路:这道题目有两种思路。动态规划和贪心。贪心的策略:当绳子的长度大于或等于5时,我们尽可能多的剪成长度为3的绳子,当剩下的绳子为4时,将绳子剪成长度为2的绳子。 #include <iostream>...原创 2018-12-27 20:27:07 · 695 阅读 · 0 评论 -
剑指offer——机器人运动范围
题目描述:地上有一个m行n列的方格,一个机器人从坐标(0,0)的格子开始移动,可以向左右上下四个方向,但是不能进入行坐标和列坐标的数位之和大于k的格子。请问机器人能够达到多少个格子? 解题思路:这道题目也是一道典型的回溯法题目,可以用递归来写。写递归的思路都相似的,通过变化若干个参数调用自己所在的函数。重点在于递归出口的编写。因为本题要求满足条件格子的数量,如果某个格子不满足条件,则返回coun...原创 2018-12-26 19:27:04 · 188 阅读 · 0 评论 -
剑指offer——矩阵中的路径
题目描述:设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径。路径可以从矩阵中任意一格开始,分别向上下左右四个方向都可以移动。如果一条路径经过了矩阵的某一格,那么该路径不能再次进入该格子。 解题思路:这是一个回溯法的经典题,最常用就是递归来做。用递归解题的最主要问题就是要注意递归的边界条件。本题为目标字符串遍历完成,即可return。还有一点需要注意,就是题目中提及,矩阵中...原创 2018-12-25 20:28:00 · 126 阅读 · 0 评论 -
剑指offer——旋转数组的最小数字
题目描述:把一个数组最开始的若干个元素搬到数组的末尾,就称之为数组的旋转。输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素。例如输入{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,输出最小值1。 题目解析:本题如果直接遍历的话复杂度为O(n),如果采用二分查找的话复杂度为O(logn)。具体逻辑:选取中间元素,如果其大于等于第一个元素,说明其处于第一个递增阶段,最小值在其或者后...原创 2018-12-24 00:12:50 · 108 阅读 · 0 评论 -
剑指offer——两个栈实现队列与两个队列实现栈
题目描述:两个栈实现队列 解题思路:栈是“先进后出”,队列是“先进先出”。操作“入队列”:利用两个栈s1和s2,元素进的时候,放入s1即可。操作“出队列”:先检查s2是否为空,如果不为空,直接pop出s2的元素,如果为空,则把s1的元素都pop出来,然后依次放入s2中,再对s2进行pop即可。 class Solution { public: void push(int node) ...原创 2018-12-21 21:33:16 · 116 阅读 · 0 评论 -
剑指offer——二叉树的下一个节点
题目描述:给定一颗二叉树和其中的一个节点,如何找出中序遍历序列的下一个节点?树中的节点除了有两个分别指向左右子树节点的指针,还有一个指向父节点的指针。 解题思路:这道题目就是要理清二叉树的前、中、后序遍历,然后分情况理清楚下一个节点就行。要举一反三。 如果这个节点有右子树,则下一个节点是右子树中最左子节点。 如果这个节点没有右子树,且节点是父节点的左子节点,则下一个节点是其父节点。 如果这...原创 2018-12-20 20:31:12 · 106 阅读 · 0 评论 -
剑指offer——重建二叉树
题目描述:输入二叉树的前序遍历和中序遍历结果,请重建二叉树。假设输入的前序遍历和中序遍历都不含重复的数字。 解题思路:首先要了解二叉树的前序遍历和中序遍历分别是是怎样的规则,了解之后就可以发现。前序遍历的首节点一定是根节点,然后再去中序遍历中查找根节点所在的位置,依此将其分为左右子树,然后分别遍历即可。注意递归边界条件,即为当发现数组中没有元素,则返回空子树。 /** * Definiti...原创 2018-12-19 20:37:01 · 104 阅读 · 0 评论 -
剑指offer——从尾到头打印链表
题目描述:输入一个链表的头节点,从尾到头反过来打印出每个节点的值。 解题思路:这道题目是链表中的基础题,主要思路有两种 第一种思路:可以利用栈的特性“后进先出”,将链表从头到尾遍历,然后将元素放到栈中,最后再取出。 第二种思路:可以利用递归的思想,在链表遍历的时候,对于每个节点而言:如果next指针不为空,则先遍历next指向的链表,回退时在打印本节点的值。 /** * struct L...原创 2018-12-17 19:00:04 · 100 阅读 · 0 评论 -
剑指offer——替换空格
题目:请实现一个函数,把字符串中的每个空格替换成"%20",例如输入“We are happy” ,输出"We%20are%20happy" 解题思路: 首先会想到从头到尾遍历一遍string,只要遇到空格就插入"%20",但是发现在数组中执行插入非常难实现,同时也有较高的复杂度。接下来就会想到是否能够直接定位出每个新元素的位置呢?答案是可以的,但是需要知道每个元素之前有多少个空格,因...原创 2018-12-17 18:17:30 · 112 阅读 · 0 评论 -
剑指offer——二维数组中的查找
题目描述:在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的二维数组和一个整数,判断数组中是否含有该整数。 解题思路:首先选取数组右上角的数字,如果该数字等于要查找的数字,则查找过程结束,如果该数字大于要查找的数字,则说明该数字所在的列都不会有目标数字,所以去掉该列,如果该数字小于要查找的数字,则说明该行都不会存在目标数字,所以去...原创 2018-12-16 19:12:42 · 98 阅读 · 0 评论 -
剑指offer——数组中重复的数字
题目一:在一个长度为n的数组中,所有的数字都在0~n-1的范围里,数组中的某些数字是重复的,但不知道有几个数字重复了,请求出数组中任意一个重复的数字。 解题思路: 首先想到的肯定是排序,然后再次遍历来查看有无重复,这样的时间复杂度至少为O(nlogn) 然后第二种想到的方法就是hash表,或者利用unordered_set,因为其内部实现也是利用hash表。具体过程就是遍历数组中的每一个元...原创 2018-12-15 20:58:02 · 161 阅读 · 0 评论