
剑指offer
ClimberCoding
基础不牢,地动山摇…
展开
-
剑指 offer 67题
文章目录《剑指 offer》剑指offer 001、二维数组中的查找题目题解1题解2剑指offer 002、替换空格题目题解1剑指offer 003、从尾到头打印链表题目题解1剑指offer 004、重建二叉树题目题解1剑指offer 005、用两个栈实现队列题目题解剑指offer 006、旋转数组的最小数字题目题解剑指offer 007、斐波那契数列题目题解剑指offer 008、跳台阶题目题解剑指offer 009、跳台阶扩展问题题目题解剑指offer 010、矩形覆盖题目题解剑指offer 011、原创 2021-11-23 22:50:17 · 767 阅读 · 0 评论 -
剑指offer 067、剪绳子
剑指offer 067、剪绳子题目题解先观察一组数据:4 : 2*25 : 2*36 : 3*37 : 2*2*38 : 2*3*39 : 3*3*310:2*2*3*311:2*3*3*312:3*3*3*313:2*2*3*3*314:2*3*3*3*3可以看出,对于所有的数字的最大乘积,都是由2和3的乘积组成,因此我们可以定义一个变量来保存3的乘积(每次乘以3,同时给number减一个3),直到number == 4为止。看代码:class Solution {原创 2021-09-28 10:48:14 · 67 阅读 · 0 评论 -
剑指offer 066、机器人的运动范围
剑指offer 066、机器人的运动范围题目题解不错不错,我们借助一个矩阵,对矩阵每个元素,当满足条件时标记,不断递归调用即可解决。class Solution {public: int movingCount(int threshold, int rows, int cols) { vector<vector<bool>> matrix(rows, vector<bool>(cols, false)); return原创 2021-09-28 10:07:46 · 75 阅读 · 0 评论 -
*剑指offer 065、矩阵中的路径
剑指offer 065、矩阵中的路径题目题解看看K神的解析:class Solution {public: bool hasPath(vector<vector<char> >& matrix, string word) { row = matrix.size(); col = matrix[0].size(); // 每次调用size()函数也是一笔开销 for (int i = 0;原创 2021-09-28 01:07:32 · 69 阅读 · 0 评论 -
*剑指offer 064、滑动窗口的最大值
剑指offer 064、滑动窗口的最大值题目题解非常不错的一道题!!!利用双端队列:滑动窗口不为空时,只要准备进入的元素大于滑动窗口最后一个元素,就删除队列前一个元素,直到队列末尾元素比新数大或队列为空时停止。看代码注释吧!class Solution {public: vector<int> maxInWindows(const vector<int>& num, unsigned int size) { if (num.empty(原创 2021-09-28 00:26:21 · 148 阅读 · 0 评论 -
剑指offer 063、数据流中的中位数
剑指offer 063、数据流中的中位数题目题解这道题在读懂题意后,利用优先队列做起来还挺方便思路:利用两个优先队列,一个是最大堆(存放最小的一半数字),一个是最小堆(存放最大的一半数字)由于数据是流式的,所以在这个过程中,最大最小堆中的元素会不断调整:当两堆的数据个数相同时,在最大堆中加入元素。(先将该元素加入最小堆中调整,然后将最小堆中的根节点(最小)会被加入到最大堆中)当两堆的数据个数不同时(只会出现一种情况:最大堆中元素个数比最小堆多一个),在最小堆中加入元素。(先将该元素放原创 2021-09-27 16:55:26 · 65 阅读 · 0 评论 -
*剑指offer 062、二叉搜索树的第k个结点
剑指offer 062、二叉搜索树的第k个结点题目题解首先想到的是递归class Solution {public: TreeNode* KthNode(TreeNode* pRoot, int k) { if (!pRoot) return nullptr; TreeNode* result = KthNode(pRoot->left, k); if (count >= k) return result;原创 2021-09-27 15:30:54 · 101 阅读 · 0 评论 -
***剑指offer 061、序列化二叉树
剑指offer 061、序列化二叉树题目题解咦~ 困难… 我可以的… 好难啊… 看看解析去… (⊙o⊙)?…写了两三个小时了… 还是不太会…/*struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right; TreeNode(int x) : val(x), left(NULL), right(NULL) { }};*/class原创 2021-09-27 01:22:15 · 73 阅读 · 0 评论 -
剑指offer 060、把二叉树打印成多行(√)
剑指offer 060、把二叉树打印成多行题目题解借助队列,将该层元素从队列中移出,并将下一层元素移入class Solution {public: vector<vector<int> > Print(TreeNode* pRoot) { if (!pRoot) return vector<vector<int> >(); vector<vector原创 2021-09-26 21:10:55 · 81 阅读 · 0 评论 -
剑指offer 059、按之字形顺序打印二叉树(√)
剑指offer 059、按之字形顺序打印二叉树题目题解非常不错的一道题利用两个栈来解决(一个栈存奇数行,另一个存偶数行)class Solution {public: vector<vector<int> > Print(TreeNode* pRoot) { if (!pRoot) return vector<vector<int> >(); vector<vector<in原创 2021-09-26 19:26:00 · 109 阅读 · 0 评论 -
*剑指offer 058、对称的二叉树
剑指offer 058、对称的二叉树题目题解思路:终止条件:当左节点和右节点同时越过叶节点,则此树所有节点对称当左右节点只有一个越过叶节点,返回false当左右节点值不相等,此树不对称,返回false递推过程:判断两节点lNode->left, rNode->right是否对称,即recur(lNode->left, rNode->right)判断两节点lNode->right, rNode->left是否对称,即recur(lNode-&原创 2021-09-26 19:25:08 · 59 阅读 · 0 评论 -
*剑指offer 057、二叉树的下一结点
剑指offer 057、二叉树的下一结点题目题解思路:二叉树为空,则返回空;有右子树,下一结点是右子树中的最左结点无右子树,且结点是该结点父结点的左子树,则下一结点是该结点的父结点无右子树,且结点是该结点父结点的右子树,则我们一直沿着父结点追朔,直到找到某个结点是其父结点的左子树,如果存在这样的结点,那么这个结点的父结点就是我们要找的下一结点/*struct TreeLinkNode { int val; struct TreeLinkNode *left;原创 2021-09-25 23:19:41 · 58 阅读 · 0 评论 -
剑指offer 056、删除链表中重复的结点
剑指offer 056、删除链表中重复的结点题目题解首先添加一个头节点,以方便碰到第一个,第二个节点就相同的情况设置 pre ,cur指针, pre指针指向当前确定不重复的那个节点,而cur指针相当于工作指针,一直往后面搜索。class Solution {public: ListNode* deleteDuplication(ListNode* pHead) { if (!pHead) return pHead; ListNode原创 2021-09-25 23:19:07 · 65 阅读 · 0 评论 -
*剑指offer 055、 链表中环的入口结点
剑指offer 055、 链表中环的入口结点题目题解利用快慢指针,从头结点开始出发,fast指针每次移动两个节点,slow每次移动一个节点,如果 fast 和 slow指针在途中相遇 ,说明这个链表有环。相遇时: slow指针走过的节点数为: x + y, fast指针走过的节点数:x + y + n (y + z)因为fast指针是一步走两个节点,slow指针一步走一个节点, 所以 fast指针走过的节点数 = slow指针走过的节点数 * 2: (x + y) * 2 = x + y +原创 2021-09-25 23:18:42 · 99 阅读 · 0 评论 -
剑指offer 054、字符流中第一个不重复的字符
剑指offer 054、字符流中第一个不重复的字符题目题解借助哈希表,很简单class Solution{public: //Insert one char from stringstream void Insert(char ch) { v.push_back(ch); result[ch]++; } //return the first appearence once char in current stringstream原创 2021-09-24 18:15:51 · 92 阅读 · 0 评论 -
***剑指offer 053、表示数值的字符串
剑指offer 053、表示数值的字符串题目题解额,直接Ctrl c, Ctrl v。官方解析:class Solution {public: enum State { STATE_INITIAL, STATE_INT_SIGN, STATE_INTEGER, STATE_POINT, STATE_POINT_WITHOUT_INT, STATE_FRACTION, STA原创 2021-09-24 16:20:07 · 81 阅读 · 0 评论 -
*剑指offer 052、正则表达式匹配
剑指offer 052、正则表达式匹配题目题解还是不太懂力扣大佬三叶姐的方法class Solution {public: bool match(string s, string p) { // 技巧,往原字符头部插入空格,这样得到的string数组是从1开始 int m = s.size(), n = p.size(); s.insert(s.begin(), ' '); p.insert(p.begin(), '原创 2021-09-24 16:19:28 · 79 阅读 · 0 评论 -
*剑指offer 051、构建乘积数组
剑指offer 051、构建乘积数组题目题解先算下三角中的连乘,即我们先算出B[i]中的一部分,然后倒过来按上三角中的分布规律,把另一部分也乘进去。class Solution {public: vector<int> multiply(const vector<int>& A) { int length = A.size(); if (length == 1) return vector<int>();原创 2021-09-23 23:52:47 · 83 阅读 · 0 评论 -
剑指offer 050、数组中重复的数字
剑指offer 050、数组中重复的数字题目题解借助哈希表:class Solution {public: int duplicate(vector<int>& numbers) { unordered_map<int, int> array; for (auto x : numbers) { array[x]++; if (array[x] == 2) return x;原创 2021-09-23 23:52:11 · 65 阅读 · 0 评论 -
*剑指offer 049、把字符串转换成整数
剑指offer 049、把字符串转换成整数题目题解class Solution {public: int StrToInt(string str) { int length = str.size(); if (length == 0) return 0; int flag = 1, symbol = 0, i = 0; long long num = 0; while (i < len原创 2021-09-23 23:51:41 · 107 阅读 · 0 评论 -
*剑指offer 048、不能加减乘除做加法
剑指offer 048、不能加减乘除做加法题目题解两个数异或:相当于每一位相加,而不考虑进位;两个数相与,并左移一位:相当于求得进位;将上述两步的结果相加示例:5->101,7->111第一步:相加各位的值,不算进位,得到010,二进制每位相加就相当于各位做异或操作,101^111。第二步:计算进位值,得到1010,相当于各位做与操作得到101,再向左移一位得到1010,(101&111)<<1。第三步重复上述两步, 各位相加 1000 =010^10原创 2021-09-22 23:32:03 · 100 阅读 · 0 评论 -
剑指offer 047、求1+2+3+...+n
剑指offer 047、求1+2+3+…+n题目题解class Solution {public: int Sum_Solution(int n) { int sum = n; // 递归调用,同时利用&&操作的短路特性实现递归终止 n > 0 && (sum += Sum_Solution(n - 1)); return sum; }};...原创 2021-09-22 23:31:27 · 63 阅读 · 0 评论 -
*剑指offer 046、孩子们的游戏(圆圈中最后剩下的数)
剑指offer 046、孩子们的游戏(圆圈中最后剩下的数)题目题解来自力扣大佬@Sweetiee的小号 的解法第二张图可能不容易理解,再看一个非常清晰的解析class Solution {public: int LastRemaining_Solution(int n, int m) { if(n <= 0 || m < 0) return -1; int result = 0; // 最后一轮剩下2人原创 2021-09-22 23:30:58 · 125 阅读 · 0 评论 -
剑指offer 045、扑克牌顺子
剑指offer 045、扑克牌顺子题目题解排序 + 遍历class Solution {public: bool IsContinuous( vector<int> numbers ) { int zeroNum = 0; sort(numbers.begin(), numbers.end()); // 给五张牌排序 for (int i = 0; i < 4; ++i) { // 总共有五原创 2021-09-22 23:30:25 · 71 阅读 · 0 评论 -
剑指offer 044、翻转单词序列
剑指offer 044、翻转单词序列题目题解从前往后一直读取,遇到空格之后就把之前读取到的压到结果的前面并添加空格。class Solution {public: string ReverseSentence(string str) { string result = "", temp = ""; // temp是当前正在处理的单词 for (auto s : str) { if (s == ' ') {原创 2021-09-22 18:59:21 · 67 阅读 · 0 评论 -
剑指offer 043、左旋转字符串
剑指offer 043、左旋转字符串题目题解自己第一次做的:class Solution {public: string LeftRotateString(string str, int n) { string temp; for (int i = 0; i < n; ++i) { temp.push_back(str[i]); } str.erase(0, n); str +=原创 2021-09-22 18:58:43 · 58 阅读 · 0 评论 -
剑指offer 042、和为S的两个数字
剑指offer 042、和为S的两个数字题目题解和41题很像,设置两个头尾指针若ai + aj == sum,就是答案(相差越远乘积越小)证明相差越远,乘积越小:设x+y=C(C是常数),y-x=d>=0即x=(C-d)/2,y=(C+d)/2x*y=(C^2 - d^2)/4,画出图形:x*y是一个关于y轴对称的,开口向下的,变量为d的函数。d>=0,d越大,x*y越大。若ai + aj > sum,aj肯定不是答案之一(前面已得出 i 前面的数已是不可能原创 2021-09-22 18:58:15 · 82 阅读 · 0 评论 -
剑指offer 041、和为S的连续正数序列
剑指offer 041、和为S的连续正数序列题目题解思路:利用双指针技术,相当于有一个窗口,窗口的左右两边就是两个指针,我们根据窗口内值之和来确定窗口的位置和宽度。注意,窗口始终是要往右移动的!不可以phigh--class Solution {public: vector<vector<int> > FindContinuousSequence(int sum) { if (sum == 1) return vector<vector&原创 2021-09-22 18:57:29 · 85 阅读 · 0 评论 -
*剑指offer 040、数组中只出现一次的两个数字
剑指offer 040、数组中只出现一次的两个数字题目题解哇这道题根本没有想起来会用 异或 来解决的力扣的官方解析思路算法先对所有数字进行一次异或,得到两个出现一次的数字的异或值。在异或结果中找到任意为 11 的位。根据这一位对所有的数字进行分组。在每个组内进行异或操作,得到两个数字。class Solution {public: vector<int> FindNumsAppearOnce(vector<int>& array) {原创 2021-09-22 18:56:36 · 74 阅读 · 0 评论 -
剑指offer 039、平衡二叉树
剑指offer 039、平衡二叉树题目题解class Solution {public: bool IsBalanced_Solution(TreeNode* pRoot) { if (!pRoot) return true; return abs(getDepth(pRoot->left) - getDepth(pRoot->right)) <= 1 && IsBalanced_Solution(pRo原创 2021-09-19 16:12:07 · 75 阅读 · 0 评论 -
剑指offer 038、二叉树的深度
剑指offer 038、二叉树的深度题目题解class Solution {public: int TreeDepth(TreeNode* pRoot) { if (!pRoot) return 0; int left = TreeDepth(pRoot->left); int right = TreeDepth(pRoot->right); return max(left, right) + 1原创 2021-09-19 16:10:03 · 68 阅读 · 0 评论 -
剑指offer 037、数字在升序数组中出现的次数
剑指offer 037、数字在升序数组中出现的次数题目题解使用二分查找class Solution {public: int GetNumberOfK(vector<int> data ,int k) { if (data.empty()) return 0; int low = 0, high = data.size() - 1; while (low <= high) { in原创 2021-09-19 16:09:38 · 95 阅读 · 0 评论 -
剑指offer 036、两个链表的第一个公共结点
剑指offer 036、两个链表的第一个公共结点题目题解分两种情况:长度相同时:若两链表有公共结点,第一次就遍历到了若无公共结点,两链表同时走到尾部nullptr,返回nullptr长度不同时:若有公共结点,第一遍差值会出来,第二遍就可以同时走到公共结点若无公共结点,第二遍时两链表同时走到尾部nullptrclass Solution {public: ListNode* FindFirstCommonNode( ListNode* pHead1, ListN原创 2021-09-18 21:34:01 · 123 阅读 · 0 评论 -
*剑指offer 035、数组中的逆序对
剑指offer 035、数组中的逆序对题目题解学习牛客大佬@rs勿忘初心 的解法class Solution {public: int InversePairs(vector<int> data) { if (data.empty()) return 0; vector<int> copy(data); // 辅助数组,每次递归后有序 long long count = InversePairsAdjust原创 2021-09-18 21:33:30 · 90 阅读 · 0 评论 -
剑指offer 034、第一个只出现一次的字符
剑指offer 034、第一个只出现一次的字符题目题解class Solution {public: int FirstNotRepeatingChar(string str) { int res = 0; // 记录返回值 unordered_map<char, int> array; // 无序哈希表记录每个字符出现的次数 for (char x : str) ++array[x];原创 2021-09-18 21:32:52 · 67 阅读 · 0 评论 -
剑指offer 033、丑数
剑指offer 033、丑数题目题解学习牛客大佬@事无巨细,悉究本末 的解法,对于一个丑数,其因子只能为2,3,5,那么丑数 p = 2 ^ x * 3 ^ y * 5 ^ z,因此我们可以维护三个队列(乘以2的、乘以3的、乘以5的),选择队列头最小的数字加入丑数列中。class Solution {public: int GetUglyNumber_Solution(int index) { // 0- 6的丑数分别是0 - 6 if (index &原创 2021-09-17 17:31:59 · 67 阅读 · 0 评论 -
剑指offer 032、把数组排成最小的数
剑指offer 032、把数组排成最小的数题目题解思路:求拼接起来的最小数字,本质上是个排序问题。设数组numbers中两数字的字符串为 x 和 y,则排序规则为:若 x + y < y + x,则 排序完数组中 x 应在 y 左侧若 x + y > y + x,则 排序完数组中 x 应在 y 右侧class Solution {public: // 写一个仿函数 bool operator()(string x, string y) {原创 2021-09-17 17:31:20 · 80 阅读 · 0 评论 -
*剑指offer 031、整数中1出现的次数(从1到n整数中1出现的次数)
剑指offer 031、整数中1出现的次数(从1到n整数中1出现的次数)题目题解太难了[/(ㄒoㄒ)/~~],真伤脑copy @superkakayong 大佬的解法:class Solution {public: int NumberOf1Between1AndN_Solution(int n) { long digit = 1; // 若n是INT_MAX digit会在最后一次循环越界 int high = n / 10, cur = n原创 2021-09-17 17:30:34 · 106 阅读 · 0 评论 -
剑指offer 030、连续子数组的最大和
剑指offer 030、连续子数组的最大和题目题解显然这是一道动态规划的题目先看第一种解法class Solution {public: int FindGreatestSumOfSubArray(vector<int> array) { if (array.size() == 0) return 0; int maxNum = array[0]; for (int i = 1; i < array.s原创 2021-09-16 18:30:57 · 65 阅读 · 0 评论 -
剑指offer 029、最小的K个数
剑指offer 029、最小的K个数题目题解第一种方法不满足题意,时间复杂度为O(n),看第二种方法解法1class Solution {public: vector<int> GetLeastNumbers_Solution(vector<int> input, int k) { if (k <= 0 || k > input.size()) return vector<int>();原创 2021-09-16 18:30:26 · 73 阅读 · 0 评论