![](https://img-blog.csdnimg.cn/20201014180756919.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
剑指offer
Everglow_zbz
这个作者很懒,什么都没留下…
展开
-
剑指offer:连续子数组的最大和
题目描述HZ偶尔会拿些专业问题来忽悠那些非计算机专业的同学。今天测试组开完会后,他又发话了:在古老的一维模式识别中,常常需要计算连续子向量的最大和,当向量全为正数的时候,问题很好解决。但是,如果向量中包含负数,是否应该包含某个负数,并期望旁边的正数会弥补它呢?例如:{6,-3,-2,7,-15,1,2,2},连续子向量的最大和为8(从第0个开始,到第3个为止)。给一个数组,返回它的最大连续子序列的和,你会不会被他忽悠住?(子向量的长度至少是1)方法一:动态规划链接:https://www.nowco原创 2020-06-09 16:19:28 · 154 阅读 · 0 评论 -
剑指offer:数组中出现次数超过一半的数字
题目描述数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。如果不存在则输出0。思路解法一:数组排序后,如果符合条件的数存在,则一定是数组中间那个数。O(N*LogN)解法二:如果有符合条件的数字,则它出现的次数比其他所有数字出现的次数和还要多。在遍历数组时保存两个值:一是数组中一个数字,一是次数。遍历下一个数字时,若它与之前保存的数字相同,则次数加1,否则原创 2020-06-09 15:07:07 · 117 阅读 · 0 评论 -
剑指offer:复杂链表的复制
题目描述输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针random指向一个随机节点),请对此链表进行深拷贝,并返回拷贝后的头结点。(注意,输出结果中请不要返回参数中的节点引用,否则判题程序会直接返回空)思路1:set/map保存深拷贝出来的每个节点,接上next域和random域思路2:/*struct RandomListNode { int label; struct RandomListNode *next, *random;原创 2020-06-08 20:03:01 · 126 阅读 · 0 评论 -
剑指offer:最小的K个数
题目描述输入n个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,。思路快速排序取前K个数class Solution {public: vector<int> GetLeastNumbers_Solution(vector<int> input, int k) { if(input.size()==0 || k>input.size()) return{};原创 2020-06-05 21:46:57 · 145 阅读 · 0 评论 -
剑指offer:两个链表的第一个公共结点
题目描述输入两个链表,找出它们的第一个公共结点。(注意因为传入数据是链表,所以错误测试数据的提示是用其他方式显示的,保证传入数据是正确的)方法一:双指针方法二:set装入第一个链表的所有结点,遍历第二个链表看set中是否已有结点/*struct ListNode { int val; struct ListNode *next; ListNode(int x) : val(x), next(NULL) { }};*/class Solution {public: Li原创 2020-06-05 15:56:17 · 102 阅读 · 0 评论 -
剑指offer:链表中环的入口结点
题目描述给一个链表,若其中包含环,请找出该链表的环的入口结点,否则,输出null。思路set容器保存每一个结点,count函数检测是否有已加入的结点,返回即可。/*struct ListNode { int val; struct ListNode *next; ListNode(int x) : val(x), next(NULL) { }};*/class Solution {public: ListNode* EntryNode原创 2020-06-05 14:03:22 · 86 阅读 · 0 评论 -
剑指offer:平衡二叉树
题目描述输入一棵二叉树,判断该二叉树是否是平衡二叉树。在这里,我们只需要考虑其平衡性,不需要考虑其是不是排序二叉树思路:最直接的做法,遍历每个结点,借助一个获取树深度的递归函数,根据该结点的左右子树高度差判断是否平衡,然后递归地对左右子树进行判断。class Solution {public: bool IsBalanced_Solution(TreeNode* pRoot) { return getDepth(pRoot) != -1; }priv原创 2020-06-04 18:07:53 · 114 阅读 · 0 评论 -
剑指offer:二叉树的镜像
题目描述操作给定的二叉树,将其变换为源二叉树的镜像。/*struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right; TreeNode(int x) : val(x), left(NULL), right(NULL) { }};*/class Solution {public: void Mirror(TreeNode *pRoot) { //1.递归原创 2020-06-03 20:57:04 · 98 阅读 · 0 评论 -
剑指offer:跳台阶&&变态跳台阶
跳台阶题目描述:一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法(先后次序不同算不同的结果)。思路:1.如果两种跳法,1阶或者2阶,那么假定第一次跳的是一阶,那么剩下的是n-1个台阶,跳法是f(n-1);2.假定第一次跳的是2阶,那么剩下的是n-2个台阶,跳法是f(n-2)3.由12假设可以得出总跳法为: f(n) = f(n-1) + f(n-2)4.然后通过实际的情况可以得出:只有一阶的时候 f(1) = 1 ,只有两阶的时候可以有 f(2) = 2原创 2020-05-14 20:13:34 · 107 阅读 · 0 评论 -
剑指offer:删除链表中重复的结点
题目描述在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5代码:/*struct ListNode { int val; struct ListNode *next; ListNode(int x) : val(x), next(NULL) { }};*/class Soluti原创 2020-05-13 21:01:08 · 98 阅读 · 0 评论 -
剑指offer:数组中只出现一次的数字
题目描述一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。方法一:利用相同两数异或为0的特性:牛客ID:披萨大叔 他的解释很棒方法二:set//方法一:class Solution {public: void FindNumsAppearOnce(vector<int> data,int* num1,int *num2) { if(data.size()<2) return; in原创 2020-05-12 22:50:27 · 100 阅读 · 0 评论 -
剑指offer:斐波那契数列
题目描述大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0,第1项是1)。n<=39思路:解法一:递归,但是测试用例n过大会不通过解法二:迭代,代码如下//时间复杂度O(N),空间复杂度O(1).也可以用数组做,不过空间复杂度就O(N)class Solution {public: int Fibonacci(int n) { if(n==0 ||n==1) return n; int f1原创 2020-05-12 20:33:16 · 107 阅读 · 0 评论 -
剑指offer:求1+2+3+...+n
题目描述求1+2+3+…+n,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)。思路:递归,利用逻辑与的短路特性代码class Solution {public: int Sum_Solution(int n) { int res = n; res && (res += Sum_Solution(n-1));//逻辑与前为假后面不计算 return res;原创 2020-05-11 21:29:53 · 112 阅读 · 0 评论 -
剑指offer:二进制中1的个数
题目描述输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。代码:方法一:class Solution {public: int NumberOf1(int n) { int count = 0; int flag = 1; while(flag!=0)//左移补0,左移到int的最高位下一位后flag == 0 { if((n & flag)!=0)//相原创 2020-05-11 20:34:00 · 95 阅读 · 0 评论 -
剑指offer:左旋转字符串
题目描述汇编语言中有一种移位指令叫做循环左移(ROL),现在有个简单的任务,就是用字符串模拟这个指令的运算结果。对于一个给定的字符序列S,请你把其循环左移K位后的序列输出。例如,字符序列S=”abcXYZdef”,要求输出循环左移3位后的结果,即“XYZdefabc”。是不是很简单?OK,搞定它!思路方法一:牛客最高赞答案方法二:在原字符串上修改。n之前翻转一次,n之后翻转一次,再整体翻转一次 证明:YX=(XTYT)TYX=(\mathbf{X}^\mathrm{T}\mathbf{Y}^\ma原创 2020-05-08 21:52:05 · 104 阅读 · 0 评论 -
剑指offer:二叉树的深度
题目描述输入一棵二叉树,求该树的深度。从根结点到叶结点依次经过的结点(含根、叶结点)形成树的一条路径,最长路径的长度为树的深度。思路:方法一:递归(DFS)方法二:层序遍历代码/*struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right; TreeNode(int ...原创 2020-05-08 15:12:56 · 98 阅读 · 0 评论 -
剑指offer:链表中倒数第k个结点
题目描述输入一个链表,输出该链表中倒数第k个结点。思路:双指针,初试距离相差K,同时走,直到快指针为空,慢指针为所求结点/*struct ListNode { int val; struct ListNode *next; ListNode(int x) : val(x), next(NULL) { }};*/class Solution {public: L...原创 2020-05-07 20:35:57 · 96 阅读 · 0 评论 -
剑指offer:替换空格
题目描述请实现一个函数,将一个字符串中的每个空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy思路记录出现的空格数count,从后向前遍历,没遇到空格之前的字符整体后移count*2个位置,直到遇到空格填满%20,下一次字符串的整体移动变成(count-1)*2个位置。class Solution {public:...原创 2020-05-07 13:35:06 · 111 阅读 · 0 评论 -
剑指offer:和为S的两个数字
证明1:来源:牛客网假设:若b>a,且存在,a + b = s;(a - m ) + (b + m) = s则:(a - m )(b + m)=ab - (b-a)m - m*m < ab;说明外层的乘积更小证明2:来源:牛客网假设:找到两组满足条件的数组对(x,y)、(x+a,y-a),其中(x+y=S, 0<a<y-x)x*y-[(x+a)(y-a)]...原创 2020-05-06 22:10:30 · 103 阅读 · 0 评论