剑指offer
cs_zh_xi
No warnings, no errors
展开
-
剑指 Offer 54. 二叉搜索树的第k大节点
给定一棵二叉搜索树,请找出其中第k大的节点。思路中序遍历树,回溯时k-1,至0时,当前节点就是所求。class Solution {public: int kthLargest(TreeNode* root, int k) { _node = nullptr; _k = k; _kthLargest(root); return _node->val; }private: void _kthLar原创 2020-12-27 16:59:17 · 71 阅读 · 0 评论 -
剑指 Offer 39. 数组中出现次数超过一半的数字
数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。你可以假设数组是非空的,并且给定的数组总是存在多数元素。解法1:最直接的解法就是,将数组排序,取中间的元素(若数组size为奇数)或中间两个元素任意一个(若数组size为偶数)。因为下标范围是0到size()-1, 所以中间元素的位置取(0 + size() - 1) / 2class Solution {public: int majorityElement(vector<int>& n.原创 2020-12-24 22:10:10 · 56 阅读 · 0 评论 -
剑指 Offer 15. 二进制中1的个数
请实现一个函数,输入一个整数(以二进制串形式),输出该数二进制表示中 1 的个数。例如,把 9表示成二进制是 1001,有 2 位是 1。因此,如果输入 9,则该函数输出 2。class Solution {public: int hammingWeight(uint32_t n) { int cnt = 0; while (n) { if (n & 1) ++cnt; .原创 2020-12-24 21:27:56 · 77 阅读 · 0 评论 -
剑指 Offer 68 - I. 二叉搜索树的最近公共祖先
给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先。二叉搜索树的特性是left< parent < right.对树进行遍历,当遇到一个节点n,它的值在两个输入节点的值之间,那么这个节点就是最近公共祖先。为什么?因为此时,两个节点已经分居n的左右两个子树,也就是不在n的同一颗子树中,所以n的子节点不可能是两个节点的公共祖先。class Solution {public: TreeNode* lowestCommonAncestor(TreeNode..原创 2020-12-23 21:33:14 · 68 阅读 · 0 评论 -
剑指 Offer 53 - I. 在排序数组中查找数字 I
题目统计一个数字在排序数组中出现的次数。解答二分查找class Solution {public: int search(vector<int>& nums, int target) { int i = 0, j = nums.size() - 1; int pos = -1; while (i <= j) { pos = (i + j) / 2; if (n原创 2020-12-23 20:49:24 · 69 阅读 · 0 评论 -
剑指 Offer 58 - I. 翻转单词顺序
题目输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变。为简单起见,标点符号和普通字母一样处理。例如输入字符串"I am a student. ",则输出"student. a am I"。示例 1:输入: "the sky is blue"输出:"blue is sky the"示例 2:输入: " hello world! "输出:"world! hello"解释: 输入字符串可以在前面或者后面包含多余的空格,但是反转后的字符不能包括。示例 3:输入: ...原创 2020-12-08 23:02:28 · 75 阅读 · 0 评论 -
剑指 Offer 55 - II. 平衡二叉树
输入一棵二叉树的根节点,判断该树是不是平衡二叉树。如果某二叉树中任意节点的左右子树的深度相差不超过1,那么它就是一棵平衡二叉树。class Solution { int depth(TreeNode* root) { if (!root) return 0; int d1 = depth(root->left); if (d1 == -1) return -1; int d原创 2020-12-08 21:37:46 · 84 阅读 · 0 评论 -
剑指 Offer 22. 链表中倒数第k个节点
题目输入一个链表,输出该链表中倒数第k个节点。为了符合大多数人的习惯,本题从1开始计数,即链表的尾节点是倒数第1个节点。例如,一个链表有6个节点,从头节点开始,它们的值依次是1、2、3、4、5、6。这个链表的倒数第3个节点是值为4的节点。解法class Solution {public: ListNode* getKthFromEnd(ListNode* head, int k) { ListNode* temp = head; while (k.原创 2020-12-07 21:35:37 · 79 阅读 · 0 评论 -
剑指 Offer 53 - II. 0~n-1中缺失的数字
题目一个长度为n-1的递增排序数组中的所有数字都是唯一的,并且每个数字都在范围0~n-1之内。在范围0~n-1内的n个数字中有且只有一个数字不在该数组中,请找出这个数字。解法1遍历nums,遇到第一个i满足nums[i] != i即是所求。class Solution {public: int missingNumber(vector<int>& nums) { for (size_t i = 0; i < nums.size(); ++原创 2020-12-07 18:35:31 · 74 阅读 · 0 评论 -
剑指 Offer 27. 二叉树的镜像
class Solution {public: TreeNode* mirrorTree(TreeNode* root) { if (!root) return nullptr; root->right = mirrorTree(root->right); root->left = mirrorTree(root->left); swap(root->right, r...原创 2020-12-07 18:10:58 · 61 阅读 · 0 评论 -
剑指 Offer 03. 数组中重复的数字
题目找出数组中重复的数字。在一个长度为 n 的数组 nums 里的所有数字都在 0~n-1 的范围内。数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。示例 1:输入:[2, 3, 1, 0, 2, 5, 3]输出:2 或 3解法class Solution {public: int findRepeatNumber(vector<int>& nums) { for ..原创 2020-12-06 23:07:59 · 91 阅读 · 0 评论 -
剑指 Offer 55 - I. 二叉树的深度
题目输入一棵二叉树的根节点,求该树的深度。从根节点到叶节点依次经过的节点(含根、叶节点)形成树的一条路径,最长路径的长度为树的深度。递归解法class Solution {public: int maxDepth(TreeNode* root) { if (!root) return 0; return max(maxDepth(root->right), maxDepth(root->left)) + 1;.原创 2020-12-05 22:38:50 · 71 阅读 · 0 评论 -
剑指 Offer 06. 从尾到头打印链表
题目输入一个链表的头节点,从尾到头反过来返回每个节点的值(用数组返回)。示例 1:输入:head = [1,3,2]输出:[2,3,1]非递归解法class Solution {public: vector<int> reversePrint(ListNode* head) { vector<int> vec; while (head) { vec.push_back(h.原创 2020-12-05 22:06:00 · 70 阅读 · 0 评论