![](https://img-blog.csdnimg.cn/20201014180756928.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
剑指offer
南山cyd
这个作者很懒,什么都没留下…
展开
-
剑指offer之 连续子数组的最大和(二)(C++)
题目输入一个长度为n的整型数组array,数组中的一个或连续多个整数组成一个子数组,找到一个具有最大和的连续子数组。1.子数组是连续的,比如[1,3,5,7,9]的子数组有[1,3],[3,5,7]等等,但是[1,3,7]不是子数组2.如果存在多个最大和的连续子数组,那么返回其中长度最长的,该题数据保证这个最长的只存在一个3.该题定义的子数组的最小长度为1,不存在为空的子数组,即不存在[]是某个数组的子数组4.返回的数组不计入空间复杂度计算要求:时间复杂度O(n)O(n),空间复杂度O(n)O原创 2022-04-25 22:53:23 · 138 阅读 · 0 评论 -
剑指offer之连续子数组的最大和(C++)
题目输入一个长度为n的整型数组array,数组中的一个或连续多个整数组成一个子数组,子数组最小长度为1。求所有子数组的和的最大值。要求:时间复杂度为 O(n)O(n),空间复杂度为 O(n)O(n)进阶:时间复杂度为 O(n)O(n),空间复杂度为 O(1)O(1)思路代码分治策略解法class Solution {public: int FindMaxCrossingSubArray(vector<int>& array, int low, int m原创 2022-04-25 22:50:49 · 974 阅读 · 0 评论 -
剑指offer之最小的k个数(C++)
题目描述输入n个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4。代码class Solution {public: vector<int> GetLeastNumbers_Solution(vector<int> input, int k) { sort(input.begin(),input.end()); vector<int> output;原创 2020-12-05 17:13:50 · 97 阅读 · 0 评论 -
剑指offer之数组中出现次数超过一半的数字(C++)
题目描述数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。如果不存在则输出0。代码class Solution {public: int MoreThanHalfNum_Solution(vector<int> numbers) { int totalNum[10] = {0}; int maxTimes原创 2020-12-05 17:12:54 · 100 阅读 · 0 评论 -
剑指offer之字符串的排列(C++)
题目描述输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则按字典序打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。输入描述输入一个字符串,长度不超过9(可能有字符重复),字符只包括大小写字母。示例一输入“ab”返回值[“ab”,“ba”]解题思路解题思路参考字符串全排列(字典序法)代码class Solution {public: vector<string> Permu原创 2020-11-29 14:36:57 · 168 阅读 · 0 评论 -
剑指offer之二叉搜索树与双向链表(C++)
题目输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。解题思路本题的实质是二叉搜索树的中序遍历,附带双向链表的构建。我采取的方法是先获取搜索树的中序遍历,存取各结点的指针,然后构建双向链表。二叉搜索树的中序遍历我采用的是Morris算法,关于Morris算法,CSDN中有篇博文讲的很详细,链接如下:Morris算法进行二叉树遍历 ,各位可前往了解。代码/*struct TreeNode { int val; struct原创 2020-11-28 20:18:04 · 121 阅读 · 0 评论 -
剑指offer之复杂链表的复制(C++)
#题目输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针random指向一个随机节点),请对此链表进行深拷贝,并返回拷贝后的头结点。(注意,输出结果中请不要返回参数中的节点引用,否则判题程序会直接返回空)代码/*struct RandomListNode { int label; struct RandomListNode *next, *random; RandomListNode(int x) : label原创 2020-11-12 21:26:10 · 62 阅读 · 0 评论 -
剑指offer之二叉树中和为某一值的路径(C++)
#题目请在这里输入输入一颗二叉树的根节点和一个整数,按字典序打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。思路思路很简单,但是说起来很费劲,贴个链接吧:https://blog.csdn.net/niqian6005/article/details/97960184代码class Solution {public: vector<vector<int> > FindPath(TreeNod原创 2020-07-05 20:04:13 · 129 阅读 · 0 评论 -
剑指offer之二叉搜索树的后序遍历序列(C++)
题目输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。思路二叉搜索树的特点就是永远是左子树<根<右子树。看到二叉树,首先想到的是递归,选择了递归,那么我们只要想好判断根,左子树,右子树的条件就可以,后序遍历,最后一个必然是根,所以当遍历序列为空时为假无疑问,但遍历序列长度为1和2时必然也可以画出相应的二叉搜索树,所以可直接判定为真,当序列长度大于等于3时,则分为3种情况:二叉树只有左子树[1,2,原创 2020-06-30 21:50:41 · 162 阅读 · 0 评论 -
剑指offer之从上往下打印二叉树(C++)
题目输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。(注意:这两个序列的长度是相等的)思路留空,过后补充。代码class Solution {public: bool IsPopOrder(vector<int> pushV,vector<int&g原创 2020-06-27 10:19:56 · 157 阅读 · 2 评论 -
剑指offer之栈的压入、弹出序列(C++)
题目输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。(注意:这两个序列的长度是相等的)思路见代码代码class Solution {public: bool IsPopOrder(vector<int> pushV,vector<int>原创 2020-06-27 10:13:07 · 116 阅读 · 0 评论 -
剑指offer之包含min函数的栈(C++)
题目定义栈的数据结构,请在该类型中实现一个能够得到栈中所含最小元素的min函数(时间复杂度应为O(1))。注意:保证测试中不会当栈为空的时候,对栈调用pop()或者min()或者top()方法。思路见代码代码class Solution {public: void push(int value) { m_data.push(value); if (m_min.empty() || value < m_min.top())原创 2020-06-27 10:07:33 · 89 阅读 · 0 评论 -
剑指offer之顺时针打印矩阵(C++)
#题目输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下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> printMatrix(vector<vector<int> >原创 2020-06-27 10:02:59 · 105 阅读 · 0 评论 -
剑指offer之二叉树的镜像(C++)
题目操作给定的二叉树,将其变换为源二叉树的镜像。输入描述二叉树的镜像定义: 源二叉树 8 / \ 6 10 / \ /\ 5 7 9 11原创 2020-06-27 10:00:07 · 111 阅读 · 0 评论 -
剑指offer之树的子结构(C++)
题目输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)思路找到头节点相同的,然后依次判断其左子树右子树。代码/*struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right; TreeNode(int x) : val(x), left(NULL), right(NULL) { }};*/class Solution {public:原创 2020-06-27 09:47:34 · 138 阅读 · 0 评论 -
剑指offer之合并两个排序的链表(C++)
题目输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。思路没什么思路代码/*struct ListNode { int val; struct ListNode *next; ListNode(int x) : val(x), next(NULL) { }};*/class Solution {public: ListNode* Merge(ListNode* pHead1, ListNode* pHead2)原创 2020-06-27 09:44:04 · 90 阅读 · 0 评论 -
剑指offer之反转链表(C++)
题目输入一个链表,反转链表后,输出新链表的表头。思路没有有递归也没有用迭代,显示将每个结点存储在vector数组里,然后反向构建链表,输出头节点。代码/*struct ListNode { int val; struct ListNode *next; ListNode(int x) : val(x), next(NULL) { }};*/class Solution {public: ListNode* ReverseList(ListNode* pHead原创 2020-06-25 11:26:10 · 144 阅读 · 0 评论 -
剑指offer之链表中倒数第K个结点(C++)
题目输入一个链表,输出该链表中倒数第k个结点。解1思路解1是直观的方法,先遍历一遍链表获取链表长度n,然后在从头开始遍历到n-k+1处,需要遍历2n-k-2次。代码/*struct ListNode { int val; struct ListNode *next; ListNode(int x) : val(x), next(NULL) { }};*/class Solution {public: ListNode* FindKthToTail(ListN原创 2020-06-25 10:30:42 · 154 阅读 · 0 评论 -
剑指offer之调整数组顺序使奇数位于偶数前面(C++)
题目输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。思路遍历数组,将奇数往前移。#代码下标遍历class Solution {public: void reOrderArray(vector<int> &array) { int temp; for (int i = 1; i < array.size()原创 2020-06-23 20:47:50 · 128 阅读 · 0 评论 -
剑指offer之数值的整数次方(C++)
#题目给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。保证base和exponent不同时为0思路无代码class Solution {public: double Power(double base, int exponent) { return pow(base,exponent); }};...原创 2020-06-22 20:04:36 · 100 阅读 · 0 评论 -
剑指offer之二进制中1的个数(C++)
题目输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。思路还记得第一次碰到这种题的时候我真的是笨了吧唧的老老实实的转成二进制去数的代码class Solution {public: int NumberOf1(int n) { int count = 0; while (n) { n = (n - 1)&n; count ++; }原创 2020-06-21 13:20:48 · 92 阅读 · 0 评论 -
剑指offer之变态跳台阶(C++)
题目一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。思路今天的题目是变态跳台阶,昨天是跳台阶,昨天跳台阶只有两种跳跃类别,再加上题目的提示,猜到了f(n)=f(n-1)+f(n-2)这个关系,实话实说,这是投机取巧,猜到了解法也只是知其然而不知其所以然,所以今天这个题就麻爪了,搜呗,搜到一大神,将其所以然解释清楚了,大神的链接如下:https://blog.csdn.net/u013408863/article/details/10原创 2020-06-20 23:34:48 · 215 阅读 · 0 评论 -
剑指offer之跳台阶(C++)
题目一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法(先后次序不同算不同的结果)。思路本题纯粹是投机取巧算来的,一开始时候毫无头绪,看到题目提示了递归,就拿笔例举了前6个数的跳法数量,发现了f(n)=f(n-1)+f(n-2)这个规律,遂解。代码class Solution {public: int jumpFloor(int number) { if (1 == number) {原创 2020-06-19 23:25:08 · 119 阅读 · 0 评论 -
剑指offer之斐波那契数列(C++)
题目大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0,第1项是1)。n<=39思路题目很简单,递归处理就好,不过题目挖了个小坑,斐波那契数列是从第1项开始的,而题目里是从0项开始,斐波那契数列前两项,也就是第1项和第2项值是给定的,而本题题目里恰巧又给了前两项,第0项和第1项,这有可能误导你以为从第2项就可以开始递归了,实则不然,我们还是应该从斐波那契数列的第3项也就是本题中的第4项开始计算,就是当你n>2时才能开始递归。代码p原创 2020-06-18 21:42:13 · 237 阅读 · 0 评论 -
剑指offer之二维数组中的查找(C++)
题目在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。思路这个题其实读起来难,只要理解了题意做起来就比较容易,归根结底就是先定位如果存在该整数,那么这个整数会存在哪一行,然后遍历该行查找,遍历的结果就是查找的结果。代码class Solution {public: bool Find(int target, vector<vector原创 2020-06-17 22:38:18 · 93 阅读 · 0 评论 -
剑指offer之旋转数组的最小数字(C++)
题目把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素。例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。思路这题一看名字,旋转数组,这是要旋转么?粗读题目,我还以为是有规律的数字旋转后找最小值,需要一定的技巧,再仔细一琢磨,这不就是给个数组找最小值么,数组数据非递减,那就是没规律呗,直接算,这题算中等难度大概考察的是阅读原创 2020-06-17 22:22:58 · 94 阅读 · 0 评论 -
剑指offer之用两个栈实现队列(C++)
题目用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型。思路本题不难,首先了解队列的Push操作和Pop操作。在stack和queue中,Push位在队尾插入数据,Pop为弹出队尾或队首数据但不返回值,但本题中Pop操作要返回数据。然后是stack,stack主要用到了empty,pop,top,push四个操作。我的想法是这样的,用stack1实现push 操作,stack2实现pop操作。push 时先将数据时将stack2中数据移入stack1,然后队尾插原创 2020-06-16 21:06:01 · 140 阅读 · 0 评论 -
剑指Offer之重建二叉树(C++)
题目输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。思路这题一般用递归的方法来解,根据先序遍历和中序遍历很容易的确定头节点,但左子叶和右子叶无法判定,但是我们可以确定左子树的先序遍历中序遍历和右子树的先序遍历中序遍历结果,提取后再次调用函数即可重建二叉树。代码class Solution {public原创 2020-06-15 22:37:21 · 121 阅读 · 0 评论 -
剑指offer之从头到尾打印链表(C++)
题目输入一个链表,按链表从尾到头的顺序返回一个ArrayList。思路其实没什么思路,就是一个简单的遍历,然后反向输出,反向输出时我尝试了反向迭代器,因为是在类中,会报错,如果不是在类中,反向迭代器是可以使用的,此处没有使用。代码/*** struct ListNode {* int val;* struct ListNode *next;* ListNode(int x) :* val(x), next(NU原创 2020-05-25 21:04:45 · 150 阅读 · 0 评论 -
剑指offer之替换空格 (C++)
题目实现一个函数,将一个字符串中的每个空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。思路在原字符串上添加,首先计算出空格的数量,同时根据此计算出字符串扩充后的长度,从后向前添加。代码class Solution {public: void replaceSpace(char *str,int length) { int numofblack = 0;/*空格数量*/ int in原创 2020-05-17 21:51:05 · 126 阅读 · 0 评论