剑指offer
zj134_
以物喜
展开
-
剑指 Offer 68 - II. 二叉树的最近公共祖先
剑指 Offer 68 - II. 二叉树的最近公共祖先 - 力扣(LeetCode)class Solution {public: TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) { if(!root) return NULL; if(p == root || q == root) return root; auto left = lowes原创 2020-10-13 01:30:01 · 113 阅读 · 0 评论 -
剑指 Offer 36. 二叉搜索树与双向链表
剑指 Offer 36. 二叉搜索树与双向链表 - 力扣(LeetCode)与leetcode 426相同。题意就是将二叉树中的left,right指针改为双向链表中的前驱,后继指针。既然是二叉搜索树,双向链表又要求顺序,那肯定就是使用中序遍历了,遍历的过程中一边遍历一边调整指针指向,最后将头尾相连即可。如果可以借助外部空间,那中序遍历将节点导入数组,再依次连接是最简单的,或者使用迭代法借助栈也可以。不借助外部空间,递归,链表头结点应为二叉树的最小值(最左边的节点):class Solution原创 2020-07-22 17:14:06 · 283 阅读 · 0 评论 -
剑指 Offer 51. 数组中的逆序对
剑指 Offer 51. 数组中的逆序对 - 力扣(LeetCode)暴力法简单粗暴,复杂度O(n^2),但是也是意料之中的超时:class Solution {public: int reversePairs(vector<int>& nums) { if(!nums.size()) return 0; int num = 0; for(int i = 0; i < nums.size()-1; ++i){原创 2020-08-10 14:52:11 · 137 阅读 · 0 评论 -
剑指 Offer 63. 股票的最大利润
剑指 Offer 63. 股票的最大利润 - 力扣(LeetCode)类似题:LeetCode第 121 题:买股票的最佳时机(C++)_zj-CSDN博客o(n^2)的dp,思路很直接,但是最后一个测试用例超时了:class Solution {public: int maxProfit(vector<int>& prices) { if(prices.empty()) return 0; vector<int> dp(pr原创 2020-09-08 13:30:11 · 140 阅读 · 0 评论 -
剑指 Offer 67. 把字符串转换成整数
剑指 Offer 67. 把字符串转换成整数 - 力扣(LeetCode)类似题:LeetCode第 8 题:字符串转换整数 (atoi)(C++)_zj-CSDN博客class Solution {public: int strToInt(string str) { int i = 0, flag = 1; long res = 0; while(str[i] == ' ') ++i;//跳过空格 if(str[i] ==原创 2020-09-08 13:02:30 · 85 阅读 · 0 评论 -
剑指 Offer 64. 求1+2+…+n - 力扣
剑指 Offer 64. 求1+2+…+n - 力扣(LeetCode)好奇怪的要求使用递归吗?class Solution {public: int sumNums(int n) { if(n == 0) return 0; return n + sumNums(n-1); }};这个用到了if,不行。。。也就是需要一种方法可以在n == 0的时候退出递归。面试题64. 求 1 + 2 + … + n(逻辑符短路,清晰图解) - 求1+2+原创 2020-09-07 22:39:01 · 212 阅读 · 0 评论 -
剑指 Offer 66. 构建乘积数组
剑指 Offer 66. 构建乘积数组 - 力扣(LeetCode)应该是不可以暴力两层循环的吧。。不能用除法。观察一下,结果数组每个位置的值等于它的两边的所有元素的乘积,那么使用两次遍历:第一次从左到右,这样每一个位置都会变为该位置之前的所有元素的乘积;第二次从右到左,这样将上一步的乘积再累乘每个位置右边的元素的乘积就可以了。class Solution {public: vector<int> constructArr(vector<int>& a)原创 2020-09-07 22:24:47 · 130 阅读 · 0 评论 -
剑指 Offer 65. 不用加减乘除做加法
剑指 Offer 65. 不用加减乘除做加法 - 力扣(LeetCode)异或:相当于无进位的求和与运算:相当于求每一位的进位数(需要左移一位)实现方法是直接把两个数对应位相加(异或),不管进位。然后进位(与)单独计算,如果某一位两个数都是 11 ,那么进位就会对下一位产生影响。然后接着算不进位求和加上进位的值,再计算新的进位,依次重复下去,直到进位为 0。c++注意负数的处理:LeetCode c++ 不允许负数左移操作,所以要转换成无符号整数class Solution {public:原创 2020-09-07 21:38:59 · 200 阅读 · 1 评论 -
剑指 Offer 68 - I. 二叉搜索树的最近公共祖先
剑指 Offer 68 - I. 二叉搜索树的最近公共祖先 - 力扣(LeetCode)相同题:leetcode第 236 题:二叉树的最近公共祖先(C++)_zj-CSDN博客迭代:class Solution {public: TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) { if(root == p || root == q) return root;原创 2020-09-07 21:15:21 · 116 阅读 · 0 评论 -
剑指 Offer 61. 扑克牌中的顺子
剑指 Offer 61. 扑克牌中的顺子 - 力扣(LeetCode)大小王也就是0可以视为任何数字。。。第202个测试用例傻了,有三个0出现。。。5张牌是顺子的 充分条件如下:除大小王之外,其他牌不能重复(可以用哈希表查重)除大小王之外,最大牌 - 最小牌 <= 4class Solution {public: bool isStraight(vector<int>& nums) { unordered_set<int> s;原创 2020-09-07 21:07:35 · 126 阅读 · 0 评论 -
剑指 Offer 62. 圆圈中最后剩下的数字
剑指 Offer 62. 圆圈中最后剩下的数字 - 力扣(LeetCode)总共n个数字,最后剩下一个数字,所以要进行n-1次删除。用数组来模拟,进行倒推,假设活下来的人为 v:当只剩下 v 的时候,数组只有一个元素,v下标只能是0当剩下两个人(x和v,X不用管是谁,反正V在两个人里面)的时候,此时这两个人的下标有两种可能:x = 0, v = 1或者x = 1, v = 0,但是只有一种可能是v活下去的,这种可能中v的下标应该为:(0+m)%2。假设m = 3,那么v的下标必须为1才能活下去。原创 2020-09-05 23:31:58 · 94 阅读 · 1 评论 -
剑指 Offer 60. n个骰子的点数
剑指 Offer 60. n个骰子的点数 - 力扣(LeetCode)概率是出现次数/总次数,n 枚骰子掷出的点数的范围是 [n, 6*n]。dp:dp[i][j] ,表示投掷完 i 枚骰子后,点数 j 的出现次数dp[i][j] += dp[i-1][j-x],x是对骰子点数进行枚举(1,2,3,4,5,6)就行了class Solution {public: vector<double> twoSum(int n) { //dp[i][j] ,表示投掷完原创 2020-09-05 23:32:06 · 152 阅读 · 0 评论 -
剑指 Offer 59 - II. 队列的最大值
剑指 Offer 59 - II. 队列的最大值 - 力扣(LeetCode)参考:如何解决 O(1) 复杂度的 API 设计题 - 队列的最大值 - 力扣(LeetCode)class MaxQueue {public: MaxQueue() { } int max_value() { return d.empty() ? -1 : d.front(); } void push_back(int value) {原创 2020-09-05 23:32:12 · 71 阅读 · 0 评论 -
剑指 Offer 59 - I. 滑动窗口的最大值
剑指 Offer 59 - I. 滑动窗口的最大值 - 力扣(LeetCode)类似题:leetcode 第 239 题:滑动窗口最大值(C++)_zj-CSDN博客暴力法就不写了写一个单调栈的:class Solution {public: vector<int> maxSlidingWindow(vector<int>& nums, int k) { vector<int> res; deque<int&原创 2020-09-05 23:32:18 · 90 阅读 · 0 评论 -
剑指 Offer 58 - II. 左旋转字符串
剑指 Offer 58 - II. 左旋转字符串 - 力扣(LeetCode)class Solution {public: string reverseLeftWords(string s, int n) { reverse(s.begin(), s.begin()+n); reverse(s.begin()+n, s.end()); reverse(s.begin(), s.end()); return s; }};原创 2020-09-05 23:31:41 · 124 阅读 · 0 评论 -
剑指 Offer 58 - I. 翻转单词顺序
剑指 Offer 58 - I. 翻转单词顺序 - 力扣(LeetCode)所以主要就是以空格进行分隔了使用istringstream进行处理class Solution {public: string reverseWords(string s) { istringstream input(s); string str, res = ""; while(input >> str){ res = str +原创 2020-09-05 23:31:33 · 111 阅读 · 0 评论 -
剑指 Offer 57 - II. 和为s的连续正数序列
剑指 Offer 57 - II. 和为s的连续正数序列 - 力扣(LeetCode)至少包含两个数,那就是在1-target-1里面进行挑选,而且还得是连续的,所以应该是回溯枚举的思路先写一个,效率一般class Solution {public: vector<vector<int>> res; vector<int> tmp; void backtrack(int idx, int sum, int target){原创 2020-09-04 18:34:56 · 130 阅读 · 0 评论 -
剑指 Offer 57. 和为s的两个数字
剑指 Offer 57. 和为s的两个数字 - 力扣(LeetCode)就是两数之和嘛class Solution {public: vector<int> twoSum(vector<int>& nums, int target) { unordered_map<int, int> m; for(const auto &num : nums){ int val = target - n原创 2020-09-04 15:34:48 · 111 阅读 · 0 评论 -
剑指 Offer 56 - II. 数组中数字出现的次数 II
剑指 Offer 56 - II. 数组中数字出现的次数 II - 力扣(LeetCode)类似题:LeetCode第 137 题:只出现一次的数字II(C++)_zj-CSDN博客class Solution {public: int singleNumber(vector<int>& nums) { int res = 0; for(int i = 0; i < 32; ++i){ int cnt = 0;原创 2020-09-04 14:37:09 · 90 阅读 · 0 评论 -
[剑指 Offer 56 - I. 数组中数字出现的次数
剑指 Offer 56 - I. 数组中数字出现的次数 - 力扣(LeetCode)看这儿:LeetCode第 260 题:只出现一次的数字 III(C++)_zj-CSDN博客class Solution {public: vector<int> singleNumbers(vector<int>& nums) { int num1 = 0, num2 = num1; int val = 0; for(const原创 2020-09-04 01:35:47 · 92 阅读 · 0 评论 -
[剑指 Offer 55 - II. 平衡二叉树
剑指 Offer 55 - II. 平衡二叉树 - 力扣(LeetCode)类似题:LeetCode第 110 题:平衡二叉树(C++)_zj-CSDN博客自上而下(存在大量重复计算:需要同时计算其子树高度,所以最下面的节点会被计算很多次高度):class Solution {public: bool isBalanced(TreeNode* root) { if(!root) return true; return isBalanced(root->原创 2020-09-04 01:10:16 · 92 阅读 · 0 评论 -
剑指 Offer 55 - I. 二叉树的深度
剑指 Offer 55 - I. 二叉树的深度 - 力扣(LeetCode)层次遍历即可class Solution {public: int maxDepth(TreeNode* root) { if(!root) return 0; queue<TreeNode*> q; q.push(root); int cnt = 0; while(!q.empty()){ int原创 2020-09-04 01:02:19 · 98 阅读 · 0 评论 -
剑指 Offer 54. 二叉搜索树的第k大节点
剑指 Offer 54. 二叉搜索树的第k大节点 - 力扣(LeetCode)简单写法:中序遍历就可以了class Solution {public: vector<int> a; void inorder(TreeNode* root){ if(!root) return; inorder(root->left); a.push_back(root->val); inorder(root-&原创 2020-09-04 00:45:34 · 168 阅读 · 0 评论 -
剑指 Offer 53 - II. 0~n-1中缺失的数字
剑指 Offer 53 - II. 0~n-1中缺失的数字 - 力扣(LeetCode)类似题:268. 缺失数字 - 力扣(LeetCode)不本本题是排序的,更简单一次遍历:class Solution {public: int missingNumber(vector<int>& nums) { for(int i = 0; i < nums.size(); ++i){ if(nums[i] != i) retu原创 2020-09-04 00:22:23 · 83 阅读 · 0 评论 -
[剑指 Offer 53 - I. 在排序数组中查找数字 I
剑指 Offer 53 - I. 在排序数组中查找数字 I - 力扣(LeetCode)一般写法class Solution {public: int search(vector<int>& nums, int target) { return count(nums.begin(), nums.end(), target); }};由于是排序数组,优化一下:class Solution {public: int search(vec原创 2020-09-04 00:01:42 · 87 阅读 · 0 评论 -
剑指 Offer 52. 两个链表的第一个公共节点
剑指 Offer 52. 两个链表的第一个公共节点 - 力扣(LeetCode)类似题:LeetCode第 160 题:相交链表(C++)_zj-CSDN博客class Solution {public: ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) { ListNode *node1 = headA, *node2 = headB; while(node1 != node2){原创 2020-09-04 01:02:36 · 67 阅读 · 0 评论 -
剑指 Offer 50. 第一个只出现一次的字符
剑指 Offer 50. 第一个只出现一次的字符 - 力扣(LeetCode)两次遍历:class Solution {public: char firstUniqChar(string s) { int a[26] = {0}; for(const auto &c : s) ++a[c - 'a']; for(const auto &c : s){ if(a[c - 'a'] == 1) retur原创 2020-09-03 23:32:08 · 103 阅读 · 0 评论 -
剑指 Offer 49. 丑数
剑指 Offer 49. 丑数 - 力扣(LeetCode)LeetCode第 264 题:丑数II(C++)_zj-CSDN博客class Solution {public: int nthUglyNumber(int n) { priority_queue<long, vector<long>, greater<long>> q; q.push(1); long val = 0; for(i原创 2020-09-03 22:58:18 · 79 阅读 · 0 评论 -
剑指 Offer 48. 最长不含重复字符的子字符串
剑指 Offer 48. 最长不含重复字符的子字符串 - 力扣(LeetCode)类似题:LeetCode第 3 题:无重复字符的最长子串(C++)_zj-CSDN博客就是滑动窗口的思路class Solution {public: int lengthOfLongestSubstring(string s) { if(s.empty()) return 0; int len = 0; int l = 0, r = 0;//窗口的左右边界原创 2020-09-03 18:54:13 · 160 阅读 · 0 评论 -
剑指 Offer 47. 礼物的最大价值
剑指 Offer 47. 礼物的最大价值 - 力扣(LeetCode)简单dp就可以了:class Solution {public: int maxValue(vector<vector<int>>& grid) { int m = grid.size(); if(m == 0) return 0; int n = grid[0].size(); vector<vector<int&原创 2020-09-03 17:10:14 · 99 阅读 · 0 评论 -
剑指 Offer 46. 把数字翻译成字符串
剑指 Offer 46. 把数字翻译成字符串 - 力扣(LeetCode)求组合数,先将数字转化为字符串,最多会有两个字符被连接起来进行翻译,考虑当前字符i,如果 i-1和i可以连接起来翻译,那么f[i] = f[i-1] + f[i-2],否则f[i] = f[i-1]。class Solution {public: int translateNum(int num) { string s = to_string(num); vector<int>原创 2020-09-03 16:45:52 · 100 阅读 · 0 评论 -
剑指 Offer 45. 把数组排成最小的数
剑指 Offer 45. 把数组排成最小的数 - 力扣(LeetCode)类似题:LeetCode第 179 题:最大数(C++)_zj-CSDN博客class Solution {public: string minNumber(vector<int>& nums) { vector<string> s; for(const auto &num : nums) s.push_back(to_string(num));原创 2020-09-03 14:40:44 · 102 阅读 · 0 评论 -
剑指 Offer 44. 数字序列中某一位的数字
剑指 Offer 44. 数字序列中某一位的数字 - 力扣(LeetCode)LeetCode第 400 题:第N个数字(C++)_zj-CSDN博客,一样的class Solution {public: int findNthDigit(int n) { //digit表示位数 long base = 9, digit = 1; while(n > base*digit){ n -= base*digit;原创 2020-09-03 14:23:10 · 111 阅读 · 0 评论 -
剑指 Offer 42. 连续子数组的最大和
《剑指 Offer(第 2 版)》 - 力扣(LeetCode)其实就是计算前缀和:LeetCode第 53 题:最大子序和(C++)_zj-CSDN博客class Solution {public: int maxSubArray(vector<int>& nums) { if(nums.empty()) return 0; int res = nums[0], sum = 0; for(const auto &原创 2020-09-02 17:14:35 · 92 阅读 · 0 评论 -
剑指 Offer 41. 数据流中的中位数
剑指 Offer 41. 数据流中的中位数 - 力扣(LeetCode)一样的题:LeetCode第 295 题:数据流中的中位数(C++)_zj-CSDN博客class MedianFinder {public: /** initialize your data structure here. */ MedianFinder() { } void adjust(){//调整数量以达到要求 auto x = cnt%2; if(q1.s原创 2020-09-02 16:48:43 · 124 阅读 · 0 评论 -
剑指 Offer 40. 最小的k个数
剑指 Offer 40. 最小的k个数 - 力扣(LeetCode)直接使用优先级队列就可以了:class Solution {public: vector<int> getLeastNumbers(vector<int>& arr, int k) { if(k == 0) return vector<int>(); priority_queue<int> q;//默认大顶堆 for(co原创 2020-09-02 09:22:44 · 86 阅读 · 0 评论 -
剑指 Offer 39. 数组中出现次数超过一半的数字
剑指 Offer 39. 数组中出现次数超过一半的数字 - 力扣(LeetCode)类似题:LeetCode第 169 题:多数元素(C++)_zj-CSDN博客摩尔投票:class Solution {public: int majorityElement(vector<int>& nums) { int res, cnt = 0; for(const auto &num : nums){ if(cnt =原创 2020-09-02 09:22:51 · 82 阅读 · 0 评论 -
剑指 Offer 37. 序列化二叉树
剑指 Offer 37. 序列化二叉树 - 力扣(LeetCode)前序遍历,dfsclass Codec {public: // Encodes a tree to a single string. string serialize(TreeNode* root) {//先序遍历 if(!root) return "#_"; string res = to_string(root->val) + "_" + serialize(root-&g原创 2020-09-02 09:23:11 · 95 阅读 · 0 评论 -
剑指 Offer 34. 二叉树中和为某一值的路径
剑指 Offer 34. 二叉树中和为某一值的路径 - 力扣(LeetCode)class Solution {public: vector<vector<int>> res; vector<int> tmp; vector<vector<int>> pathSum(TreeNode* root, int sum) { dfs(root, sum); return res; }原创 2020-09-01 15:10:41 · 81 阅读 · 0 评论 -
剑指 Offer 33. 二叉搜索树的后序遍历序列
剑指 Offer 33. 二叉搜索树的后序遍历序列 - 力扣(LeetCode)对于任意一颗树,根节点总是后序遍历中的最后一个节点,后序遍历的形式总是:[ [左子树的后序遍历结果], [右子树的后序遍历结果], 根节点 ]所以划分点就是第一个大于根节点的元素,第一个区间内的元素必然全部小于根节点,第二个区间的元素必然全部大于根节点。class Solution {public: bool verifyPostorder(vector<int>& postorder)原创 2020-09-01 14:25:22 · 203 阅读 · 0 评论