
剑指offer
l_c_c_c
这个作者很懒,什么都没留下…
展开
-
剑指 Offer 57. 和为s的两个数字 剑指 Offer 57 - II. 和为s的连续正数序列
题目:剑指 Offer 57. 和为s的两个数字题目描述:输入一个递增排序的数组和一个数字s,在数组中查找两个数,使得它们的和正好是s。如果有多对数字的和等于s,则输出任意一对即可。代码:class Solution {public: vector<int> twoSum(vector<int>& nums, int target) { vector<int>res; int sum,i=0,j=nums.size(原创 2020-09-29 23:36:28 · 211 阅读 · 0 评论 -
leetcode155. 最小栈 1441. 用栈操作构建数组 剑指 Offer 09. 用两个栈实现队列
题目:leetcode155. 最小栈题目描述:设计一个支持 push ,pop ,top 操作,并能在常数时间内检索到最小元素的栈。代码:class MinStack {public: /** initialize your data structure here. */ stack<int>s1; stack<int>s2; void push(int x) { s1.push(x); if(s2.原创 2020-09-27 23:52:31 · 796 阅读 · 0 评论 -
剑指offer 简单 C++
题目:剑指 Offer 22. 链表中倒数第k个节点题目描述:输入一个链表,输出该链表中倒数第k个节点。为了符合大多数人的习惯,本题从1开始计数,即链表的尾节点是倒数第1个节点。例如,一个链表有6个节点,从头节点开始,它们的值依次是1、2、3、4、5、6。这个链表的倒数第3个节点是值为4的节点。代码:/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next;原创 2020-09-22 23:12:17 · 248 阅读 · 0 评论 -
剑指 Offer 68 - II. 二叉树的最近公共祖先C++
题目描述:给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。解题思路:(1)在root的左子树和右子树同时找p和q,若p和q分别分布在root的左右子树,则root为所求。(2)若左子树返回NULL,则说明p和q都在右子树,则进入右子树做1。(3) 若右子树返回NULL,则说明p和q都在左子树,则进入左子树左1。代码:/** * Definition for a binary tree node. * struct TreeNode { * int val; * Tree原创 2020-09-02 23:11:45 · 187 阅读 · 0 评论 -
剑指 Offer 65. 不用加减乘除做加法C++
题目描述:写一个函数,求两个整数之和,要求在函数体内不得使用 “+”、“-”、“*”、“/” 四则运算符号。解题思路:代码:class Solution {public: int add(int a, int b) { //无进位和,进位值 int sum,carry; while(b!=0){ //异或操作得无进位和 sum=a^b; //与操作后移位得进位值原创 2020-08-17 21:41:37 · 96 阅读 · 0 评论 -
剑指 Offer 60. n个骰子的点数C++
题目描述:把n个骰子扔在地上,所有骰子朝上一面的点数之和为s。输入n,打印出s的所有可能的值出现的概率。你需要用一个浮点数数组返回答案,其中第 i 个元素代表这 n 个骰子所能掷出的点数集合中第 i 小的那个的概率。解题思路:n 枚骰子掷出的点数的范围是 [n, 6n],也就是最后数组的长度为 5n + 1,因为每个骰子掷出每个数字的概率都是 1/6,所以对于 n 枚骰子,每次掷出的数字组合的概率都为 (1/6)^n。也就是说如果和为 s 的组合有 k 种,那么和为 s 的概率为 k(1/6)^n我们这里原创 2020-08-16 19:23:16 · 229 阅读 · 0 评论 -
剑指 Offer 55 - I. 二叉树的深度C++
题目描述:输入一棵二叉树的根节点,求该树的深度。从根节点到叶节点依次经过的节点(含根、叶节点)形成树的一条路径,最长路径的长度为树的深度。代码:/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL)原创 2020-08-15 22:39:50 · 84 阅读 · 0 评论 -
剑指 Offer 24. 反转链表C++
题目描述:定义一个函数,输入一个链表的头节点,反转该链表并输出反转后链表的头节点。解题思路:定义两个指针:(1) pre 和 cur;preprepre 在前 curcurcur 在后。(2)每次让 pre 的 next 指向 cur ,实现一次局部反转。(3)局部反转完成之后, pre 和 cur 同时往前移动一个位置循环上述过程,直至 pre 到达链表尾部。代码:/** * Definition for singly-linked list. * struct ListNode { *原创 2020-08-14 21:38:44 · 163 阅读 · 0 评论 -
剑指 Offer 30. 包含min函数的栈C++
题目描述:定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的 min 函数在该栈中,调用 min、push 及 pop 的时间复杂度都是 O(1)。解题思路:一个栈存数据,一个栈存最小值。代码:class MinStack {public: /** initialize your data structure here. */ MinStack() {} stack<int>s; stack<int>Min; voi原创 2020-08-13 19:27:48 · 412 阅读 · 0 评论 -
剑指 Offer 09. 用两个栈实现队列C++
题目描述:用两个栈实现一个队列。队列的声明如下,请实现它的两个函数 appendTail 和 deleteHead ,分别完成在队列尾部插入整数和在队列头部删除整数的功能。(若队列中没有元素,deleteHead 操作返回 -1 )。解题思路:只使用一个栈 stack1 当作队列,另一个栈 stack2 用来辅助操作。队列是先进后出,栈是先进先出。要想将新加入的元素出现栈底,需要先将 stack1 的元素转移到 stack2,将元素入栈 stack1,最后将 stack2 的元素全部回到 stack1。原创 2020-08-12 20:21:49 · 239 阅读 · 0 评论 -
剑指 Offer 06. 从尾到头打印链表C++
题目描述:输入一个链表的头节点,从尾到头反过来返回每个节点的值(用数组返回)。解题思路:利用栈先进后出的特点。代码:/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(x), next(NULL) {} * }; */class Solution {public: vector&原创 2020-08-11 22:01:36 · 213 阅读 · 0 评论 -
剑指 Offer 32 - II. 从上到下打印二叉树 IIC++
题目描述:从上到下按层打印二叉树,同一层的节点按从左到右的顺序打印,每一层打印到一行。解题思路:这道题其实就是层序遍历二叉树并依次输出每层二叉树的元素。先建立一个队列,根结点入队,取队列大小为l。在for(i=0;i<l;i++)中队首元素依次压入容器vector,然后出队。若根结点有左右孩子则将左右孩子入队。代码:/** * Definition for a binary tree node. * struct TreeNode { * int val; * Tree原创 2020-08-10 20:25:52 · 165 阅读 · 0 评论 -
剑指 Offer 27. 二叉树的镜像C++
题目描述:请完成一个函数,输入一个二叉树,该函数输出它的镜像。解题思路:每次遍历左右子树前,先交换左右子树。代码:/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */原创 2020-08-09 19:05:12 · 170 阅读 · 0 评论 -
剑指 Offer 06. 从尾到头打印链表C++
题目描述:输入一个链表的头节点,从尾到头反过来返回每个节点的值(用数组返回)。代码:/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(x), next(NULL) {} * }; */class Solution {public: vector<int> revers原创 2020-08-08 21:19:26 · 159 阅读 · 0 评论 -
剑指 Offer 03. 数组中重复的数字C++
题目描述:在一个长度为 n 的数组 nums 里的所有数字都在 0~n-1 的范围内。数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。 : val(x), next(NULL) {} * }; */class Solution {public: ListNode* d原创 2020-08-06 21:54:46 · 163 阅读 · 0 评论 -
剑指 Offer 25. 合并两个排序的链表C++
题目描述:输入两个递增排序的链表,合并这两个链表并使新链表中的节点仍然是递增排序的。代码:/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(x), next(NULL) {} * }; */class Solution {public: ListNode* mergeTwoLis原创 2020-08-05 21:59:28 · 303 阅读 · 0 评论 -
剑指 Offer 10- I. 斐波那契数列C++
题目描述:写一个函数,输入 n ,求斐波那契(Fibonacci)数列的第 n 项。斐波那契数列的定义如下:代码:class Solution {public: int fib(int n) { if(n==0) return 0; vector<int>dp(n+1); dp[0]=0; dp[1]=1; for(int i=2;i<=n;i++) dp[i]=(dp[i-1原创 2020-08-04 22:38:14 · 104 阅读 · 0 评论 -
剑指 Offer 28. 对称的二叉树C++
题目描述:请实现一个函数,用来判断一棵二叉树是不是对称的。如果一棵二叉树和它的镜像一样,那么它是对称的。解题思路:一棵二叉树的左右孩子同样是两棵二叉树。二叉树要想对称,左右孩子的值要相等,左孩子的右子树要等于右孩子的左子树;右孩子的右子树要等于左孩子的左子树。代码 * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right原创 2020-08-03 22:30:18 · 265 阅读 · 0 评论 -
剑指 Offer 55 - II. 平衡二叉树C++
题目描述:输入一棵二叉树的根节点,判断该树是不是平衡二叉树。如果某二叉树中任意节点的左右子树的深度相差不超过1,那么它就是一棵平衡二叉树。解题思路:1.若为空返回true。2.计算左子树和右子树的高度差 高度计算方式就是求二叉树的最大深度。3.所有节点都满足高度差小于等于1 返回true。4.否则有一个高度差大于1 则返回false。代码:/** * Definition for a binary tree node. * struct TreeNode { * int val; *原创 2020-08-02 21:02:57 · 207 阅读 · 0 评论 -
剑指 Offer 68 - I. 二叉搜索树的最近公共祖先
题目描述:给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先。解题思路:利用二叉搜索树左子树的值小于根的值,右子树的值大于根的值的特点。代码:/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(原创 2020-08-01 20:27:39 · 68 阅读 · 0 评论 -
剑指 Offer 55 - I. 二叉树的深度C++
题目描述:输入一棵二叉树的根节点,求该树的深度。从根节点到叶节点依次经过的节点(含根、叶节点)形成树的一条路径,最长路径的长度为树的深度。解题思路:指针指向队头元素然后队头元素出队;队头元素如果有左右孩子依次入队。迭代代码:/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode原创 2020-07-31 21:18:45 · 266 阅读 · 1 评论 -
剑指 Offer 66. 构建乘积数组C++
题目描述:给定一个数组 A[0,1,…,n-1],请构建一个数组 B[0,1,…,n-1],其中 B 中的元素 B[i]=A[0]×A[1]×…×A[i-1]×A[i+1]×…×A[n-1]。不能使用除法。代码:class Solution {public: vector<int> constructArr(vector<int>& a) { int tmp=1,n=a.size(); vector<int>ans(n原创 2020-07-02 22:43:57 · 231 阅读 · 0 评论 -
剑指 Offer 58 - II. 左旋转字符串C++
题目描述:字符串的左旋转操作是把字符串前面的若干个字符转移到字符串的尾部。请定义一个函数实现字符串左旋转操作的功能。比如,输入字符串"abcdefg"和数字2,该函数将返回左旋转两位得到的结果"cdefgab"。代码解析:s.substr(pos, n),返回一个string,包含s中从pos开始的n个字符的拷贝。代码:class Solution {public: string reverseLeftWords(string s, int n) { return (s+s)原创 2020-07-01 19:20:30 · 439 阅读 · 0 评论 -
剑指 Offer 58 - I. 翻转单词顺序C++
题目描述:输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变。为简单起见,标点符号和普通字母一样处理。例如输入字符串"I am a student. “,则输出"student. a am I”。代码解析:istringstream对象可以绑定一行字符串,然后以空格为分隔符把该行分隔开来。代码:class Solution {public: string reverseWords(string s) { stack<string>stk;原创 2020-06-30 22:36:34 · 237 阅读 · 0 评论 -
剑指 Offer 52. 两个链表的第一个公共节点C++
题目描述:输入两个链表,找出它们的第一个公共节点。解题思路:一直走一直走直到两个节点相等不断循环遍历两个链表终有一次会相遇。代码:/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(x), next(NULL) {} * }; */class Solution {public:原创 2020-06-29 21:37:02 · 254 阅读 · 0 评论 -
剑指 Offer 42. 连续子数组的最大和C++
题目描述:输入一个整型数组,数组里有正数也有负数。数组中的一个或连续多个整数组成一个子数组。求所有子数组的和的最大值。代码解析: pre=max(pre+i,i),以当前元素结尾的子数组的最大和。代码:class Solution {public: int maxSubArray(vector<int>& nums) { int pre=0,res=nums[0]; for(int &i:nums){ pre=ma原创 2020-06-28 19:38:41 · 308 阅读 · 0 评论 -
剑指 Offer 57. 和为s的两个数字C++
题目描述:输入一个递增排序的数组和一个数字s,在数组中查找两个数,使得它们的和正好是s。如果有多对数字的和等于s,则输出任意一对即可。解题思路:数组第一个元素和最后一个元素先相加,如果大了最后一个元素向前移,小了第一个元素向后移。代码:class Solution {public: vector<int> twoSum(vector<int>& nums, int target) { vector<int>result;原创 2020-06-27 22:31:37 · 264 阅读 · 0 评论 -
剑指 Offer 40. 最小的k个数C++
题目描述:输入整数数组 arr ,找出其中最小的 k 个数。例如,输入4、5、1、6、2、7、3、8这8个数字,则最小的4个数字是1、2、3、4。解题思路:用sort排好序。代码:class Solution {public: vector<int> getLeastNumbers(vector<int>& arr, int k) { sort(arr.begin(),arr.end()); return vector<i原创 2020-06-26 21:59:49 · 731 阅读 · 0 评论 -
剑指 Offer 21. 调整数组顺序使奇数位于偶数前面C++
题目描述:输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有奇数位于数组的前半部分,所有偶数位于数组的后半部分。代码解析:nums[i]&1==1判断nums[i]是否为奇数。代码:class Solution {public: vector<int> exchange(vector<int>& nums) { int j=0; for(int i=0;i<nums.size();i++){原创 2020-06-25 22:07:33 · 175 阅读 · 0 评论 -
剑指 Offer 11. 旋转数组的最小数字C++
题目描述:把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素。例如,数组 [3,4,5,1,2] 为 [1,2,3,4,5] 的一个旋转,该数组的最小值为1。 解题思路:先用二分法排好序。代码:class Solution {public: int minArray(vector<int>& numbers) { if(numbers.size()==0) return -1;原创 2020-06-24 22:49:06 · 118 阅读 · 0 评论 -
剑指offer 22链表中倒数第k个节点C++
题目描述:输入一个链表,输出该链表中倒数第k个节点。为了符合大多数人的习惯,本题从1开始计数,即链表的尾节点是倒数第1个节点。例如,一个链表有6个节点,从头节点开始,它们的值依次是1、2、3、4、5、6。这个链表的倒数第3个节点是值为4的节点。解题思路:p1先走k步,等p1走完时p2刚好在倒数第k个位置。代码:/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *n原创 2020-06-23 22:20:31 · 139 阅读 · 0 评论 -
剑指offer 25合并两个排序的链表C++
题目描述:输入两个递增排序的链表,合并这两个链表并使新链表中的节点仍然是递增排序的。代码:/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(x), next(NULL) {} * }; */class Solution {public: ListNode* mergeTwoLis原创 2020-06-22 22:08:28 · 145 阅读 · 0 评论 -
剑指offer 18删除链表的结点C++
题目描述:给定单向链表的头指针和一个要删除的节点的值,定义一个函数删除该节点。返回删除后的链表的头节点。代码:/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(x), next(NULL) {} * }; */class Solution {public: ListNode* d原创 2020-06-21 19:27:32 · 178 阅读 · 0 评论 -
剑指offer 17.打印从1到最大的n位数C++
题目描述:输入数字 n,按顺序打印出从 1 到最大的 n 位十进制数。比如输入 3,则打印出 1、2、3 一直到最大的 3 位数 999。##### 代码解析:pow(10,n),10的n次方的值。代码:class Solution {public: vector<int> printNumbers(int n) { vector<int>res; if(n==0) return res; for(int i=1,max原创 2020-06-20 21:53:55 · 168 阅读 · 0 评论 -
剑指offer面试题03 数组中重复的数组C++
题目描述:在一个长度为 n 的数组 nums 里的所有数字都在 0~n-1 的范围内。数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。代码:class Solution {public: int findRepeatNumber(vector<int>& nums) { sort(nums.begin(),nums.end()); int j=0; for(int原创 2020-06-18 22:53:48 · 101 阅读 · 0 评论 -
剑指offer 面试题10- I. 斐波那契数列C++
题目描述:写一个函数,输入 n ,求斐波那契(Fibonacci)数列的第 n 项。斐波那契数列的定义如下:代码:class Solution {public: int fib(int n) { if(n==0) return 0; vector<int>dp(n+1); dp[0]=0; dp[1]=1; for(int i=2;i<=n;i++) dp[i]=(dp[i-1原创 2020-06-17 21:51:25 · 169 阅读 · 0 评论 -
剑指offer面试题04 二维数组中的查找C++
题目描述:在一个 n * m 的二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。代码:class Solution {public: bool findNumberIn2DArray(vector<vector<int>>& matrix, int target) { if(matrix.size()==0) return false;原创 2020-06-16 14:29:46 · 237 阅读 · 0 评论 -
剑指offer面试题06 从尾到头打印链表C++
题目描述:输入一个链表的头节点,从尾到头反过来返回每个节点的值(用数组返回)。反转法:* Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(x), next(NULL) {} * }; */class Solution {public: vector<int> reversePri原创 2020-06-16 13:29:03 · 337 阅读 · 0 评论