剑指Offer
AlphaSZH
bruce's fans
展开
-
剑指Offer——数组中的逆序对
题目描述在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数P。并将P对1000000007取模的结果输出。 即输出P%1000000007思路:运用归并排序的思想。class Solution {public: long long InversePairsCore(vector<int> &...原创 2019-08-12 15:15:04 · 67 阅读 · 0 评论 -
剑指Offer——二叉树中和为某一值的路径
题目描述输入一颗二叉树的根节点和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。(注意: 在返回值的list中,数组长度大的数组靠前)思路:先序遍历,边界条件是叶子节点、空节点、路径值吻合节点。左右子树遍历完要回退。class Solution {private: int count=0; vect...原创 2019-08-01 15:44:20 · 63 阅读 · 0 评论 -
剑指Offer——二叉树中和为某一值的路径
题目描述输入一颗二叉树的根节点和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。(注意: 在返回值的list中,数组长度大的数组靠前)思路:先序遍历,边界条件是叶子节点、空节点、路径值吻合节点。左右子树遍历完要回退。class Solution {private: int count=0; vect...原创 2019-08-01 15:42:18 · 85 阅读 · 0 评论 -
剑指Offer——左旋转字符串
题目描述汇编语言中有一种移位指令叫做循环左移(ROL),现在有个简单的任务,就是用字符串模拟这个指令的运算结果。对于一个给定的字符序列S,请你把其循环左移K位后的序列输出。例如,字符序列S=”abcXYZdef”,要求输出循环左移3位后的结果,即“XYZdefabc”。是不是很简单?OK,搞定它!思路例如“abcde”,左移1位,先完全翻转得到“edcba”,再局部翻转得到结果“bcdea”...原创 2019-08-20 15:08:41 · 127 阅读 · 0 评论 -
剑指Offer——和为S的两个数字
题目描述输入一个递增排序的数组和一个数字S,在数组中查找两个数,使得他们的和正好是S,如果有多对数字的和等于S,输出两个数的乘积最小的。输出描述:对应每个测试案例,输出两个数,小的先输出。思路:双指针,一个在首i,一个在尾j。判断两个数的和sum,如果大于s,那么肯定让j–;如果小于s,肯定让i++。class Solution {public: vector<int&g...原创 2019-08-14 15:20:08 · 67 阅读 · 0 评论 -
剑指Offer——和为S的连续正数序列
题目描述小明很喜欢数学,有一天他在做数学作业时,要求计算出9~16的和,他马上就写出了正确答案是100。但是他并不满足于此,他在想究竟有多少种连续的正数序列的和为100(至少包括两个数)。没多久,他就得到另一组连续正数和为100的序列:18,19,20,21,22。现在把问题交给你,你能不能也很快的找出所有和为S的连续正数序列? Good Luck!输出描述:输出所有和为S的连续正数序列。序...原创 2019-08-14 15:06:52 · 76 阅读 · 0 评论 -
剑指Offer——数组中只出现一次的数字
题目描述一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。思路:如果题目说“一个整型数组里除了1个数字之外,其他的数字都出现了两次”,那么这个问题就好办了,直接拿0去遍历异或数组中的数,结果就是只出现一次的数。针对这道题来说,就是想办法把数组分成两块,可以计算数组全部异或的结果(也就是那两个只出现一次的数异或的结果),结果中二进制形式中最右边的1肯定就...原创 2019-08-14 10:49:56 · 97 阅读 · 0 评论 -
剑指Offer——连续子数组的最大和
题目描述HZ偶尔会拿些专业问题来忽悠那些非计算机专业的同学。今天测试组开完会后,他又发话了:在古老的一维模式识别中,常常需要计算连续子向量的最大和,当向量全为正数的时候,问题很好解决。但是,如果向量中包含负数,是否应该包含某个负数,并期望旁边的正数会弥补它呢?例如:{6,-3,-2,7,-15,1,2,2},连续子向量的最大和为8(从第0个开始,到第3个为止)。给一个数组,返回它的最大连续子序列...原创 2019-08-02 07:52:13 · 92 阅读 · 0 评论 -
剑指Offer——旋转数组的最小数字
思路:采用二分查找,分这几种情况。1. 保证旋转数组(a[low]>=a[high]),若不保证,则没有旋转,是单调递增的,直接输出第一个数;否则下面几种情况;2. 只剩两个数,第二个肯定最小;3. a[low]=a[mid]=a[high],如[1,1,1,0,1],最小值不好判断,只能挨个找,因为a[low]>=a[high],所以让low++;4. a[mid]>=...原创 2019-07-28 16:43:03 · 67 阅读 · 0 评论 -
剑指Offer——最小的k个数
题目描述输入n个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,。思路:1,快排思想,一次partition找到第low小位置,多次partition直到low==k-1为止;2,维护一个大顶推,依次遍历,更新堆,时间复杂度为O(nlogk)。class Solution {public: vector<int&...原创 2019-08-01 18:17:26 · 65 阅读 · 0 评论 -
剑指Offer——数组中出现次数超过一半的数字
题目描述数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。如果不存在则输出0。1,map存储 int MoreThanHalfNum_Solution(vector<int> numbers) { int len = numb...原创 2019-08-01 17:48:11 · 89 阅读 · 0 评论 -
剑指Offer——二叉树中和为某一值的路径
题目描述输入一颗二叉树的根节点和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。(注意: 在返回值的list中,数组长度大的数组靠前)思路:先序遍历,边界条件是叶子节点、空节点、路径值吻合节点。左右子树遍历完要回退。class Solution {private: int count=0; vect...原创 2019-08-01 16:39:30 · 70 阅读 · 0 评论 -
剑指Offer——二叉搜索树的后序遍历序列
题目描述输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。思路:对于二叉搜索树的后序遍历序列来说,最后一个节点的为根节点,前面应该有一半节点大于该节点,一半小于该节点。基于此,如下代码。class Solution {public: bool VerifySquenceOfBST(vector&...原创 2019-08-01 15:14:45 · 80 阅读 · 0 评论 -
剑指Offer——从上往下打印二叉树
题目描述从上往下打印出二叉树的每个节点,同层节点从左至右打印。思路:借助队列,若左孩子不空,入左孩子;右孩子不空,入右孩子。vector<int> PrintFromTopToBottom(TreeNode* root) { queue<TreeNode *> q; vector<int> result; i...原创 2019-08-01 14:27:21 · 87 阅读 · 0 评论 -
剑指Offer——栈的压入、弹出序列
题目描述输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。(注意:这两个序列的长度是相等的)思路:借助辅助栈,按出栈序列元素从压入序列进行压栈。bool IsPopOrder(...原创 2019-08-01 14:24:42 · 95 阅读 · 0 评论 -
剑指Offer——调整数组顺序使奇数位于偶数前面
思路:此题若没有“保证奇数和奇数,偶数和偶数之间的相对位置不变”这一条件,可以用快排的思想,但是条件所限,只能考虑稳定的算法,快速排序、选择排序、希尔排序都是不稳定的,只能选冒泡排序,插入排序了。void reOrderArray(vector<int> &a) {//基于冒泡排序 int len = a.size(); if(len==0)...原创 2019-07-30 17:13:06 · 78 阅读 · 0 评论 -
剑指Offer——数值的整数次方
思路:考虑边界情况,1:0-exponent基数为0,指数为负数的话,没有意义;2:基数不为0,指数为负数的话,要考虑结果变为倒数。class Solution {public: double Power(double base, int exponent) { if(base==0.0&&exponent<0) retur...原创 2019-07-30 15:33:31 · 116 阅读 · 0 评论 -
剑指Offer——平衡二叉树
题目描述输入一棵二叉树,判断该二叉树是否是平衡二叉树。思路:平衡二叉树要么为空树要么左右子树高度差小于等于1,后序遍历,每遍历到一个节点的时候我们已经遍历了该节点的左右子树,只要在遍历每个节点的时候记录他的深度,就可以一边遍历一边判断该节点是不是平衡的。class Solution {public: bool IsBalanced_Solution(TreeNode* pRoot)...原创 2019-08-02 19:51:47 · 72 阅读 · 0 评论 -
剑指Offer——第一个只出现一次的字符
题目描述在一个字符串(0<=字符串长度<=10000,全部由字母组成)中找到第一个只出现一次的字符,并返回它的位置, 如果没有则返回 -1(需要区分大小写).思路:因为char类型为1B=8bits,所以采用map来存储256个字符情况,扫描两边数组,第一遍给对应字符赋值次数,第二遍检查出现一次的字符位置。int FirstNotRepeatingChar(string str)...原创 2019-08-02 17:25:43 · 85 阅读 · 0 评论 -
剑指Offer——丑数
题目描述把只包含质因子2、3和5的数称作丑数(Ugly Number)。例如6、8都是丑数,但14不是,因为它包含质因子7。 习惯上我们把1当做是第一个丑数。求按从小到大的顺序的第N个丑数。思路:1,逐个判断(判断数a是否为丑数,将a除以2,除以3,除以5直到除不尽为止,若余数为1则为丑数;2,维护一个丑数排序数组,一个丑数乘以2或者3或者5肯定还是丑数,取最小的数放入数组,将该最小数对应的乘...原创 2019-08-02 17:08:53 · 65 阅读 · 0 评论 -
剑指Offer——把数组排成最小的数
题目描述输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323。思路:因为要拼接int数字,所以这里面涉及到int越界问题,所以题目返回string;主要是制定比较算法来对数组进行排序,至于比较算法什么时候返回true,规定“ab”<“ba”时返回true。例如“3”和...原创 2019-08-02 15:50:01 · 76 阅读 · 0 评论 -
剑指Offer——二进制中1的个数
思路一:让1不断左移去位与nint NumberOf1(int n) { if(n==0) return 0; int count = 0; int flag = 1; while(flag!=0) { if((n&flag)!=0) ...原创 2019-07-30 10:02:22 · 100 阅读 · 0 评论 -
剑指offer——矩形覆盖
思路:如上图,用2x1的去覆盖2x10的矩形,让2x10为f(10),第一步有两种方法:1,2x1的竖着放在第一列,则还剩下2x9的矩形,记为f(9);2,2x1的横着放在第一行,那么第二行只能横着放一个,则还剩下2x8的矩形,记为f(8);则f(10)=f(9)+f(8)。int rectCover(int n) { if(n<=2) return ...原创 2019-07-29 20:53:15 · 117 阅读 · 0 评论 -
剑指Offer——跳台阶/变态跳台阶
跳台阶思路:斐波那契数列的应用。其实第一次只有两种跳法:第一次跳一个台阶,那么后面就有f(n-1)次跳法;第一次跳两个的话,后面就有f(n-2)次跳法int jumpFloor(int number) { if(number<=2) return number; int minN = 1; int m...原创 2019-07-29 20:33:52 · 78 阅读 · 0 评论 -
剑指Offer——链表中倒数第k个结点
题目描述输入一个链表,输出该链表中倒数第k个结点。思路:快慢指针,快的先走k步,到第k个节点,然后快慢指针一起跑,快指针到最后一个节点时,慢指针就是倒数第k个节点。注意:1,边界条件:头结点为空或者k为0;2,快指针先走k步,i<k-1即可;3,一起跑的终止条件是快指针指到最后一个节点而不是最后一个节点的next。ListNode* FindKthToTail(ListNode* p...原创 2019-07-30 17:39:53 · 107 阅读 · 0 评论 -
剑指Offer——反转链表
题目描述——输入一个链表,反转链表后,输出新链表的表头。思路:一个指针指向当前节点,一个指针指向前驱节点。 ListNode* ReverseList(ListNode* pHead) { if(!pHead) return NULL; ListNode* p = pHead; ListNode* pre = NULL;...原创 2019-07-30 18:36:59 · 62 阅读 · 0 评论 -
剑指Offer-用两个栈实现队列
思路:一个栈s1入队列,一个栈s2出队列。入队列时,把s2全部倒在s1中,然后将入队列的数压在s1中;出队列时,把s1全部倒在s2中,取s2栈顶元素出队列。class Solution{public: void push(int node) { while(!s2.empty()) { s1.push(s2.top()); ...原创 2019-07-27 15:36:26 · 59 阅读 · 0 评论 -
剑指offer——重建二叉树
思路:知道前序和中序求二叉树,我觉得主要是弄清前序序列和中序序列的长度区间。首先在前序里面找根节点,在中序里面找左右子树;在中序序列里面找到根节点所在的位置,求出左子树长度和右子树长度,然后递归建树。TreeNode* reConstructBinaryTreeCore(vector<int> pre, int preL, int preH, vector<int> vi...原创 2019-07-27 15:21:41 · 74 阅读 · 0 评论 -
Linux常用命令
~/ 主目录 ./当前目录 …/上一级目录原创 2019-07-13 10:54:44 · 83 阅读 · 0 评论 -
剑指offer——二维数组中的查找
思路:考虑从四个角遍历,首先去除左上角和右下角的考虑,因为在左上角的走向都是递增的,在右下角的走向都是递减的,没法判断往哪个线路走;所以要考虑从另外两个角出发。bool Find(int target, vector<vector<int> > array) { int row = array.size(); if(row==0) ...原创 2019-07-27 11:12:36 · 76 阅读 · 0 评论 -
剑指offer——替换空格
思路:遍历字符串找出空格数目count,原长度+count*2=替换后长度。从后往前插。void replaceSpace(char *str,int length) { if(length==0||str==NULL) return; int count=0; for(int i=0;i<length;i++) ...原创 2019-07-27 11:33:50 · 76 阅读 · 0 评论 -
剑指Offer——包含min函数的栈
题目描述定义栈的数据结构,请在该类型中实现一个能够得到栈中所含最小元素的min函数(时间复杂度应为O(1))。思路:使用两个栈,一个存数据,一个存最小值,两个栈中的元素数量始终是一致的,也就是数据栈中push元素时,也要把当前最小值push进最小值栈。class Solution {private: stack<int> m_min; stack<int&...原创 2019-07-31 15:17:50 · 79 阅读 · 0 评论 -
剑指Offer——树的子结构
题目描述输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)思路:要依次遍历A中的节点,找到和B的根节点一样的节点时,就检查A中以当前节点存在的子树是否包含B。class Solution {public: bool HasSubtree(TreeNode* A, TreeNode* B) { bool result =...原创 2019-07-31 14:58:46 · 67 阅读 · 0 评论 -
剑指Offer——二叉树的镜像
题目描述操作给定的二叉树,将其变换为源二叉树的镜像。输入描述:二叉树的镜像定义:源二叉树 8 / \ 6 10 / \ / \ 5 7 9 11 镜像二叉树 8 / \ 10 6 / \ / \ 11 9 7 5思路:先前序遍历二叉树,若有子树,就交换两个子树,若是叶子节点,就不交换。class Solu...原创 2019-07-31 14:21:10 · 64 阅读 · 0 评论 -
剑指Offer——合并两个排序的链表
非递归版ListNode* Merge(ListNode* pHead1, ListNode* pHead2) { if(!pHead1) return pHead2; if(!pHead2) return pHead1; ListNode* p1=pHead1; ListNo...原创 2019-07-30 21:00:36 · 65 阅读 · 0 评论 -
剑指Offer——斐波那契数列
思路:f(0)=0,f(1)=1,f(n)=f(n-1)+f(n-2).首先想到递归,但是会产生一些冗余计算,复杂度是O(n^2),所以用迭代方法,让f(0)=0,f(1)=1作为已知条件,从下往上算。[外链图片转存失败(img-FKTTu1CH-1564393199043)(https://www.cuijiahua.com/wp-content/uploads/2017/11/basis_7...原创 2019-07-29 17:40:55 · 99 阅读 · 0 评论