![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
剑指offer
刷题记录
尘埃飞舞
凡心所向,素履以往;
生如逆旅,一苇以航。
展开
-
LeetCode-剑指 Offer 53 - II. 0~n-1中缺失的数字
剑指 Offer 53 - II. 0~n-1中缺失的数字思路一:简单for循环找class Solution {public: int missingNumber(vector<int>& nums) { if(nums.empty()) return 0; int res=nums[0]; for(int i=0;i<nums.size();i++){ if(nums[i]!=i){原创 2021-10-14 17:48:43 · 66 阅读 · 0 评论 -
LeetCode-剑指 Offer 50. 第一个只出现一次的字符
剑指 Offer 50. 第一个只出现一次的字符class Solution {public: char firstUniqChar(string s) { unordered_map<char, int> unmap; for(char c:s){ unmap[c]++; } for(char c:s){ if(unmap[c]==1){ return原创 2021-09-26 11:12:06 · 91 阅读 · 0 评论 -
LeetCode-剑指 Offer 53 - I. 在排序数组中查找数字 I
剑指 Offer 53 - I. 在排序数组中查找数字 I思路一:二分单边 + 线性扫描先用一次二分查找找到边界,再再边界里面寻找目标值class Solution {public: int search(vector<int>& nums, int target) { int low=0; int high=nums.size()-1; int res=0; //判断只有一个数的情况 //原创 2021-09-26 09:22:36 · 105 阅读 · 2 评论 -
LeetCode-剑指 Offer 58 - I. 翻转单词顺序
剑指 Offer 58 - I. 翻转单词顺序思路一:也是核心思想,就是先把句子中所有字符串取出放入字符串数组,再对数组中的字符串进行操作后重新连接即可,具体问题具体细节还需要按题目要求分析而遍历句子取字符串的思路,就是遇到字符把它放入临时字符串,遇到空格或者标点(如果有标点),就把临时字符串输出,并且清空class Solution {public: string reverseWords(string s) { s+=' '; //为了最后一个可以判断进入原创 2021-09-25 11:08:04 · 65 阅读 · 0 评论 -
LeetCode-剑指 Offer 52. 两个链表的第一个公共节点
剑指 Offer 52. 两个链表的第一个公共节点思路一:用set容器,不符合题意/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(x), next(NULL) {} * }; */class Solution {public: ListNode *getIntersection原创 2021-09-25 10:14:07 · 82 阅读 · 0 评论 -
LeetCode-剑指 Offer 22. 链表中倒数第k个节点
剑指 Offer 22. 链表中倒数第k个节点思路一:利用快慢双指针/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(x), next(NULL) {} * }; */class Solution {public: ListNode* getKthFromEnd(ListNode原创 2021-09-19 16:02:55 · 70 阅读 · 0 评论 -
LeetCode-剑指 Offer 32 - I. 从上到下打印二叉树
剑指 Offer 32 - I. 从上到下打印二叉树思路一:BFS广度优先遍历1: 定义一个res返回值2:定义一个队列,先把头节点压入队列3:while循环判断队列是否为空不为空进入循环4:先取出队列第一个判断左右子树为不为空,不为空就先存值到res,再往后压入队列中/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNo原创 2021-09-16 15:37:17 · 135 阅读 · 0 评论 -
LeetCode-剑指 Offer 18. 删除链表的节点
剑指 Offer 18. 删除链表的节点思路:用一个头节点,以及pre,cur双指针/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(x), next(NULL) {} * }; */class Solution {public: ListNode* deleteNode(Lis原创 2021-09-16 15:15:07 · 65 阅读 · 0 评论 -
LeetCode-剑指 Offer 14- I. 剪绳子
思路一:动态规划1:首先我们想要求长度为n的绳子剪掉后的最大乘积,可以从前面比n小的绳子转移而来2:用一个dp数组记录从0到n长度的绳子剪掉后的最大乘积,也就是dp[i]表时长度为i的绳子剪成m段后的最大乘积,初始化dp[2]=13:我们把绳子剪掉第一段(长度为j),如果只减去1,对最后的乘积没有任何增益,所以长度为2开始剪4:剪了第一段后,剩下(i-j)长度可以不剪。如果不剪对应j*(i-j);如果剪去对应j*dp[i-j]。取两者最大值max(j*(i-1),j * dp[i-j])5:第一段原创 2021-09-16 11:23:35 · 116 阅读 · 0 评论 -
LeetCode-剑指 Offer 15. 二进制中1的个数
剑指 Offer 15. 二进制中1的个数思路一:n>>1一直右移动,如果为1则res++class Solution {public: int hammingWeight(uint32_t n) { //定义一个res用来返回值 int res=0; //当n不为0时候一直进入循环 while(n){ if((n&1)==1){ //如果最后一位是1则res++原创 2021-09-15 22:13:02 · 96 阅读 · 0 评论 -
LeetCode-剑指 Offer 21. 调整数组顺序使奇数位于偶数前面
剑指 Offer 21. 调整数组顺序使奇数位于偶数前面思路一:使用快慢双指针1: i找偶数找到了,继续往下执行,找不到i++2:j找奇数,找到了继续往下执行,找不到j–3:最后交换class Solution {public: vector<int> exchange(vector<int>& nums) { //双指针,i找偶数,j找奇数 int i=0,j=nums.size()-1; while(i&原创 2021-09-15 21:47:52 · 78 阅读 · 0 评论 -
LeetCode-剑指 Offer 28. 对称的二叉树
剑指 Offer 28. 对称的二叉树对称二叉树定义:对于树中任意两个对称节点L和R,一定有:L.val == R.val:这两个对称节点值相等L.left.val == R.right.val:即L的左子节点和R的右子节点对称;L.right.val == R.left.val:即L的右子节点和R的左子节点对称接下来递归处理:特例:若根节点root为空,则直接返回true返回值:即 recur(root.left, root.right)/** * Definition for a原创 2021-09-15 11:32:16 · 83 阅读 · 0 评论 -
LeetCode-剑指 Offer 13. 机器人的运动范围
剑指 Offer 13. 机器人的运动范围思路一:利用dfs深度优先搜索首先确定递归搜索的终止条件1:i,j超出范围2:数位之和大于k3:(i,j)被访问过接下来进行dfs可以进行一个dfs减枝优化,由于从0,0开始,则只要判断右边和下边即可,因为左和上一定会在搜索过程中被包括class Solution {public: // set<vector<int>> visited; //用来存访问过的数 //获取行列坐标之和原创 2021-09-15 10:50:33 · 83 阅读 · 0 评论 -
LeetCode-剑指 Offer 27. 二叉树的镜像
剑指 Offer 27. 二叉树的镜像思路一:递归从根节点开始,递归的对树进行遍历,并从叶子节点开始翻转,得到镜像。如果当前遍历到的节点root的左右两棵子树都已经翻转得到了镜像,那么我们只需要交换两棵子树的位置,即可得到以root为跟节点的整颗子树的镜像。/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right原创 2021-09-13 18:17:44 · 116 阅读 · 0 评论 -
LeetCode-剑指 Offer 25. 合并两个排序的链表
剑指 Offer 25. 合并两个排序的链表思路一:双指针法1.设置dummy为头结点,放置于新链表之前,最后返回的就是dummy.next;设置cur为当前节点,从dummy开始2.当两个链表都非空时进入循环,令新链表的下一个节点cur.next为val更小的节点,相应的链表节点后移一位3.每次循环记得cur也要后移一位4.如果循环结束后还有链表非空,cur指向非空链表5.返回dummy.next/** * Definition for singly-linked list. * str原创 2021-09-12 14:26:08 · 179 阅读 · 0 评论 -
LeetCode-剑指 Offer 06. 从尾到头打印链表
剑指 Offer 06. 从尾到头打印链表思路一:翻转1:用vector存从头到尾的每个节点值2:返回时候用reverse翻转一下时间复杂度:O(n)空间复杂度:O(n)/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(x), next(NULL) {} * }; */class原创 2021-09-12 11:38:49 · 107 阅读 · 0 评论 -
LeetCode-剑指 Offer 12. 矩阵中的路径
剑指 Offer 12. 矩阵中的路径思路一:DFS+回溯DFS 解析:递归参数: 当前元素在矩阵 board 中的行列索引 i 和 j ,当前目标字符在 word 中的索引 k 。终止条件:返回 false : (1) 行或列索引越界 或 (2) 当前矩阵元素与目标字符不同 或 (3) 当前矩阵元素已访问过 ( (3) 可合并至 (2) ) 。返回 true : k = len(word) - 1 ,即字符串 word 已全部匹配。递推工作:标记当前矩阵元素: 将 board[i][j]原创 2021-09-12 10:14:32 · 78 阅读 · 0 评论 -
LeetCode-剑指 Offer 10- I. 斐波那契数列
剑指 Offer 10- I. 斐波那契数列思路一:递归会超出时间限制class Solution {public: int fib(int n) { if(n<2) return n; return fib(n-1) + fib(n-2); }};思路二:动态规划class Solution {public: int fib(int n) { if(n<2) return n; vector原创 2021-09-10 23:48:44 · 93 阅读 · 0 评论 -
LeetCode-剑指 Offer 11. 旋转数组的最小数字
剑指 Offer 11. 旋转数组的最小数字思路一:先排序,返回第一个数组值class Solution {public: int minArray(vector<int>& numbers) { sort(numbers.begin(),numbers.end()); return numbers[0]; }};思路二:暴力法从下标为0的元素开始便利每次进行比较,如果当前元素比相邻的下一个元素大,则对应的下一个元素即为最原创 2021-09-11 23:35:59 · 90 阅读 · 0 评论 -
LeetCode-剑指 Offer 10- II. 青蛙跳台阶问题
剑指 Offer 10- II. 青蛙跳台阶问题思路一:递归,会超出时间限制class Solution {public: int numWays(int n) { if(n==0||n==1) return 1; if(n==2) return 2; int res = numWays(n-1)+numWays(n-2); return res%1000000007; }};思路2:动态规划class Solut原创 2021-09-11 22:39:54 · 102 阅读 · 0 评论 -
LeetCode-剑指 Offer 04. 二维数组中的查找
剑指 Offer 04. 二维数组中的查找思路一:暴力解法,两层for循环查找时间复杂度为:O(nm)空间复杂度为:O(1)class Solution {public: bool findNumberIn2DArray(vector<vector<int>>& matrix, int target) { if(matrix.empty()) return false; int n = matrix.size();原创 2021-09-11 15:32:56 · 207 阅读 · 0 评论 -
LeetCode-剑指 Offer 03. 数组中重复的数字
剑指 Offer 03. 数组中重复的数字思路一:先排序,然后找到最近的两个相邻的一样数返回class Solution {public: int findRepeatNumber(vector<int>& nums) { sort(nums.begin(),nums.end()); for(int i=1;i<nums.size();i++){ if(nums[i]==nums[i-1]){原创 2021-09-11 00:00:04 · 104 阅读 · 0 评论