A题笔记
金让
这个作者很懒,什么都没留下…
展开
-
牛客网《剑指Offer》编程 1.二维数组中的查找
题目描述在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。函数原型bool Find(int target, vector<vector<int> > array)思路1.最先想到的思路是自左向右,自上向下遍历ar...原创 2018-08-30 16:37:41 · 178 阅读 · 0 评论 -
牛客网《剑指Offer》编程 17.树的子结构
题目描述输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)。解题思路判断一棵树是不是另一棵树的子结构,并不是判断是不是另一棵树的子树。pRoot1树是原树,pRoot2树是待判断的树。在这里我们可以分两步进行。外层函数实现:首先在pRoot1树中找到和pRoot2树根节点值相同的子树。内层函数实现:在找到与pRoot2根节点值相同的子树之...原创 2018-09-19 09:14:45 · 166 阅读 · 0 评论 -
牛客网《剑指Offer》 编程 18. 二叉树的镜像
题目描述操作给定的二叉树,将其变换为源二叉树的镜像。输入描述二叉树的镜像定义:源二叉树 8 / \ 6 10 / \ / \ 5 7 9 11 镜像二叉树 8 / \ 10 6 / \ / \ 11 9 7 5...原创 2018-09-19 09:19:46 · 134 阅读 · 0 评论 -
牛客网《剑指Offer》编程 25.复杂链表的复制(优化的暴力法)
题目描述输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head。(注意,输出结果中请不要返回参数中的节点引用,否则判题程序会直接返回空)解题思路这次试用优化之后的暴力法解题。首先 遍历一次原链表,这次只复制next域。同时将原链表与复制链表中节点的一一对应关系,存储在map中。比如原链表中的节点为...原创 2018-09-23 22:49:34 · 148 阅读 · 0 评论 -
牛客网《剑指Offer》 编程 25.复杂链表的复制 (最优解法)
题目描述输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head。(注意,输出结果中请不要返回参数中的节点引用,否则判题程序会直接返回空)解题思路这次使用时间复杂度为O(n),空间复杂度为O(1)的算法。首先,在原链表的每个节点后面复制相应的链表节点,即复制next域。然后,复制random...原创 2018-09-24 10:38:16 · 181 阅读 · 0 评论 -
牛客网《剑指Offer》编程 26.二叉搜索树与双向链表
题目描述输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。解题思路二叉搜索树的特点是按照中序遍历的话,结果就会是一个从小到大排序的数组。所以使用一个指针指向刚遍历过的节点,另一个指针指向当前节点。采用递归遍历的方式。如果当前节点不为空节点,则将当前节点的左节点指向刚遍历过的节点;如果刚遍历过的节点不为空,则...原创 2018-09-24 17:26:13 · 221 阅读 · 0 评论 -
牛客网《剑指Offer》编程 28.数组中出现的超过一半的数字
题目描述数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。如果不存在则输出0。解题思路(1)用map统计每一个数的频率,当频率超过一半+1的时候停止统计,该数即为超过一半的数字。代码实现(1)int MoreThanHalfNum_Sol...原创 2018-10-05 16:05:54 · 177 阅读 · 0 评论 -
牛客网 《剑指Offer》编程 20.包含min函数的栈
题目描述定义栈的数据结构,请在该类型中实现一个能够得到栈中所含最小元素的min函数(时间复杂度应为O(1))。基本思路第一种思路:在数值入栈的时候记录最小值。最后返回最小值即可。但是如果最小值弹出了,不能返回第二小的值,所以没什么用。第二种思路:元素正常入主栈。使用一个辅助栈,在入栈时,如果辅助栈为空或者当前元素的值小于辅助栈栈顶值,则将当前元素压入辅助栈;如果辅助站不为空...原创 2018-09-19 21:11:23 · 117 阅读 · 0 评论 -
牛客网《剑指Offer》 编程 21.栈的压入、弹出序列
题目描述输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。(注意:这两个序列的长度是相等的)。解题思路需要设置一个辅助栈。测试某个序列是否是一个出栈序列,可以通过测试原序...原创 2018-09-20 21:28:21 · 160 阅读 · 0 评论 -
牛客网《剑指Offer》 编程 22. 从上往下打印二叉树
题目描述从上往下打印出二叉树的每个节点,同层节点从左至右打印。解题思路设置一个队列。先将根节点入队。当队列不为空的时候, 如果队首节点的左子树不为空,则将左子树入队。如果右子树不为空,将右子树入队。 将队首元素的val域放入vector中。队首元素出队。最后返回vector。代码实现/*struct TreeNode { int va...原创 2018-09-20 22:14:17 · 157 阅读 · 0 评论 -
牛客网《剑指Offer》 编程 23. 二叉树的后序遍历序列
题目描述输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。解题思路二叉搜索树的特点:后序遍历的时候最后一个数是根节点。前面的数分为两个部分,本别是左子树部分和右子树部分。左子树不部分的所有数都比根节点小;右子树部分的所有数都比根节点大。因此可以这样判定:如果该二叉树空树,则返回false;...原创 2018-09-22 11:11:53 · 172 阅读 · 0 评论 -
牛客网《剑指Offer》编程 24.二叉树中和为某一值的路径
题目描述输入一颗二叉树的跟节点和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。(注意: 在返回值的list中,数组长度大的数组靠前)。解题思路由于最后要得到从根到叶子节点的路径,因此使用二叉树的前序遍历算法。将当前节点值加入sum中,并且将当前节点加入路径中。如果sum值恰好等于要求的和,且该节点为叶...原创 2018-09-23 11:32:06 · 180 阅读 · 0 评论 -
牛客网《剑指Offer》编程 29.最小的k个数 (解法1,需要改变原数组)
题目描述输入n个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,。解题思路由于快速排序每次能够把一个数放置在正确的位置上。因此,我们可以使用快速排序的Partition函数,对数组进行排序,直到第k个数被放在数组中第k个位置上为止。此时第k个数的左边都是比它小的数,右边都是比它大的数。最后输出前k个数就可以了。使用快速...原创 2018-10-05 18:06:31 · 202 阅读 · 0 评论 -
牛客网《剑指Offer》 编程 29.最小的k个数(使用c++提供的set或者multiset)
题目描述输入n个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,。解题思路此次使用不改变原数组的方法。使用c++STL中的set或者multiset来实现。这两个模板底层的实现都是红黑树。即平衡的二叉搜索树。以下是对set和multiset的简单介绍:STL 说明 set<T> 按照从小到大...原创 2018-10-06 22:17:19 · 377 阅读 · 0 评论 -
牛客网《剑指Offer》编程 29. 最小的k个元素 (使用堆)
题目描述输入n个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,。解题思路本题可以构建一个size为k的最大堆进行求解。遍历数组。当堆中元素总量小于k的时候,将当前元素放入堆;当堆中元素总量等于k的时候,将当前元素与堆顶的元素比较。如果比最大的元素大,淘汰当前元素;如果比对顶元素小,对顶元素出堆,并将当前元素插...原创 2018-10-07 14:58:46 · 178 阅读 · 0 评论 -
牛客网 《剑指Offer》 编程 25.复杂链表的复制(暴力解法)
题目描述输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head。(注意,输出结果中请不要返回参数中的节点引用,否则判题程序会直接返回空)解题思路最简单的是使用暴力解法。本题的数据结构:节点有三个部分组成:label域存数值,next域存该节点的下一个节点地址,random域存该节点随便指向的一个节...原创 2018-09-23 21:33:58 · 547 阅读 · 0 评论 -
牛客网《剑指Offer》编程 16. 合并两个有序链表
题目描述输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。基本思路设置一个头结点newHead,newHead初始化乘两个链表中头结点较小的节点。当第一个链表中的节点值小于等于第二个时, 将newHead指向第一个链表节点; 调整正newHea...原创 2018-09-12 22:52:24 · 269 阅读 · 0 评论 -
牛客网《剑指Offer》编程 2.替换空格
关于字符串的知识:运行以下代码,查看结果:void test() { char str1[] = "helloworld"; char str2[] = "helloworld"; char* str3 = "helloworld"; char*str4 = "helloworld"; if (str1 == str2) { cout << true <<原创 2018-08-30 23:10:51 · 170 阅读 · 0 评论 -
牛客网《剑指Offer》3.从尾到头打印链表
题目描述输入一个链表,按链表值从尾到头的顺序返回一个ArrayList。单链表的数据结构如下:struct ListNode { int val; struct ListNode *next; ListNode(int x) : val(x), next(NULL) { } };解题思...原创 2018-08-31 10:54:28 · 123 阅读 · 0 评论 -
牛客网《剑指Offer》编程 4.重建二叉树
题目描述输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。基本思路二叉树的先序遍历为 根左右;二叉树的中序遍历为 左根右。先序遍历都会先遍历到根节点。根据先序遍历找到根节点;在中序遍历中根据根节...原创 2018-09-04 14:57:03 · 146 阅读 · 0 评论 -
牛客网《剑指Offer》编程 5.用两个堆栈实现队列的push和pop操作
题目描述用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型。解题思路两个堆栈分别是stack1和stack2。push操作:直接将元素push入stack1里面即可。pop操作:将stack2作为队列首,每次有元素都从stack2中弹出即可。因此当stack2不空的时候,直接将栈顶元素弹出,就是队列首的元素;stack2为空时 ,将stack1中...原创 2018-09-04 20:10:21 · 215 阅读 · 0 评论 -
牛客网《剑指Offer》编程 13.调整数组使得奇数位于偶数前面
题目描述输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。基本思路将奇数放在偶数前面可以用冒泡排序法。把奇数冒泡到前面的时候,偶数自然就在后面了。i 之前的元素为奇数;当arr[j]为奇数且arr[j-1]为偶数时,交换arr[j]和arr[j+1]。或者存放入...原创 2018-09-11 23:06:26 · 134 阅读 · 0 评论 -
牛客网《剑指Offer》编程 6.旋转数组的最小值
题目描述把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。 输入一个非减排序的数组的一个旋转,输出旋转数组的最小元素。 例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。 NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。解题思路旋转数组的最小元素可能出现在任何的位置。遍历数组。如果该数比前面的数大,则该数不是最小值;...原创 2018-09-09 15:34:56 · 130 阅读 · 0 评论 -
牛客网《剑指Offer》编程 7.斐波那契数列
题目描述大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0)。n<=39解题思路斐波那契数列公式:f(n)=f(n-1)+f(n-2),本题使用递归和非递归两种方式进行计算。另外不使用数组储存斐波那契数列,因为如果n足够大,则会使得数组存储不下。实现代码int Fibonacci(int n) { ...原创 2018-09-09 15:43:05 · 156 阅读 · 0 评论 -
牛客网《剑指Offer》编程 8.跳台阶
题目描述一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法(先后次序不同算不同的结果)。解题思路同斐波那契数列,f(n)=f(n-1)+f(n-2)代码实现int jumpFloor(int number) { if(number==0){return 0;} else if(number==1){retu...原创 2018-09-09 15:46:31 · 131 阅读 · 0 评论 -
牛客网《剑指Offer》编程 9.变态跳台阶
题目描述一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。解题思路由 f(n-1) = f(n-2) + f(n-3) + … + 1f(n) = f(n-1) + f(n-2) +f(n-3) … + 1归纳出:f(n)=f(n-1)+f(n-1)=2*f(n-1)代码实现int jumpFloor...原创 2018-09-09 15:52:03 · 165 阅读 · 0 评论 -
牛客网《剑指Offer》编程 10.矩形覆盖
题目描述我们可以用2*1的小矩形横着或者竖着去覆盖更大的矩形。请问用n个2*1的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法?解题思路同斐波那契数列。代码实现int rectCover(int number) { if(number==1){return 1;} else if(number==2){return 2;} ...原创 2018-09-09 15:53:58 · 180 阅读 · 0 评论 -
牛客网《剑指Offer》 编程 11.二进制中1的个数
题目描述输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。解题思路使用位运算。设置变量flag=1,设置计数器cnt记录1的个数。当flag!=0的时候: 每次将flag和该数按位与。如果按位与结果为1,cnt++。 flag向左移动一位。代码实现int NumberOf1(int n) { unsigned flag...原创 2018-09-09 16:04:05 · 124 阅读 · 0 评论 -
牛客网《剑指Offer》 编程 12.数值的整数次方
题目描述给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。解题思路一般情况下都能够想到的代码是double normalPower(double base,int exponent){ double result=1.0; for(int i=1;i<=exponent;i++){...原创 2018-09-10 09:10:15 · 173 阅读 · 0 评论 -
牛客网《剑指Offer》编程 14.链表中倒数第k个节点
题目描述输入一个链表,输出该链表中倒数第k个结点。解题思路用快慢指针。快指针超前慢指针k个节点,然后和慢指针一起移动,最后当快指针指向空的时候,慢指针指的刚好是链表中导数第k个元素。代码实现/*struct ListNode { int val; struct ListNode *next; ListNode(int x) : val(x), next(NULL...原创 2018-09-12 22:21:05 · 178 阅读 · 0 评论 -
牛客网《剑指Offer》 编程 15.反转链表
题目描述输入一个链表,反转链表后,输出新链表的表头。基本思路把链表里的节点先压栈,然后弹栈。代码实现/*struct ListNode { int val; struct ListNode *next; ListNode(int x) : val(x), next(NULL) { }};*/class Solution {public: List...原创 2018-09-12 22:25:58 · 132 阅读 · 0 评论 -
牛客网 《剑指Offer》编程 30.连续子数组最大和
题目描述HZ偶尔会拿些专业问题来忽悠那些非计算机专业的同学。今天测试组开完会后,他又发话了:在古老的一维模式识别中,常常需要计算连续子向量的最大和,当向量全为正数的时候,问题很好解决。但是,如果向量中包含负数,是否应该包含某个负数,并期望旁边的正数会弥补它呢?例如:{6,-3,-2,7,-15,1,2,2},连续子向量的最大和为8(从第0个开始,到第3个为止)。给一个数组,返回它的最大连续子序...原创 2018-10-07 21:17:49 · 192 阅读 · 0 评论