leetcode
healer-c
让灵魂和身体总有一个在路上
展开
-
剑指 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原创 2021-05-16 17:23:29 · 267 阅读 · 0 评论 -
剑指 Offer 24. 反转链表(C++ 实现)
文章目录题目描述方法一:迭代代码方法二:递归代码题目描述方法一:迭代代码/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(x), next(NULL) {} * }; */class Solution {public: ListNode* reverseList(ListN原创 2021-05-16 17:15:51 · 233 阅读 · 0 评论 -
剑指 Offer 22. 链表中倒数第k个节点
文章目录题目描述方法一思路代码题目描述方法一思路首先统计链表的长度(length),然后顺便遍历链表,直至 length - k 时停止,此时指向的就是链表倒数第 k 个节点。代码/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(x), next(NULL) {} * }; */原创 2021-05-16 10:32:00 · 175 阅读 · 0 评论 -
剑指 Offer 21. 调整数组顺序使奇数位于偶数前面
文章目录题目描述方法一思路代码题目描述方法一思路定义两个快慢指针,慢指针 i 初始化为 0,快指针初始化指向 nums 的最后一个元素;循环遍历,当 i 指向的元素是奇数且 i < j 时,i 自增 1,当 j 指向的元素是偶数且 i < j 时,j 自减 1;若跳出循环时 i 仍小于 j,则说明 i 指向的元素是偶数,j 指向的元素是奇数,不满足题意,交换这两个数,重复上述步骤,直至 i >= j。代码class Solution {public: vec原创 2021-05-15 21:50:27 · 177 阅读 · 0 评论 -
剑指 Offer 18. 删除链表的节点
文章目录题目描述方法一:顺序遍历代码题目描述方法一:顺序遍历代码/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(x), next(NULL) {} * }; */class Solution {public: ListNode* deleteNode(ListNode*原创 2021-05-15 21:42:53 · 174 阅读 · 0 评论 -
剑指 Offer 17. 打印从1到最大的n位数
文章目录题目描述方法一:顺序打印代码题目描述方法一:顺序打印代码class Solution {public: vector<int> printNumbers(int n) { vector<int> v; int end = pow(10, n); for (int i = 1; i < end; ++i) { v.push_back(i); } ret原创 2021-05-15 21:40:36 · 85 阅读 · 0 评论 -
剑指 Offer 16. 数值的整数次方
文章目录题目描述方法一:转换成二进制思路代码题目描述方法一:转换成二进制思路可将 xnx^nxn 中的 n 用二进制表示,如:若 n = 5,n=101(B)=20+22n = 101(B) = 2^0 + 2^2n=101(B)=20+22。判断 n 的最后一位是否为 1, 若为 1 ,则乘上该位对应的数值大小。代码class Solution {public: double myPow(double x, int n) { double res = 1;原创 2021-05-15 21:33:57 · 147 阅读 · 0 评论 -
剑指 Offer 15. 二进制中1的个数
文章目录题目描述方法一:与 1 按位与思路代码方法二:与 n - 1 按位与思路代码题目描述方法一:与 1 按位与思路将 n 和 1 作按位与操作,若结果是 1,则说明 n 对应的二进制最后一位是 1,计数器加一。没判断完一位,就将 n 右移一位,直至 n 为 0。代码class Solution {public: int hammingWeight(uint32_t n) { int cnt = 0; while (n) {原创 2021-05-15 21:20:29 · 191 阅读 · 0 评论 -
剑指 Offer 14- II. 剪绳子 II
文章目录题目描述方法一:数学推导思路代码题目描述方法一:数学推导思路思路和剑指 Offer 14- I. 剪绳子中的方法二(数学推导)一致。代码class Solution {public: int cuttingRope(int n) { if (n <= 3) { return n - 1; } long long int res = 1; if (n % 3 == 2) {原创 2021-05-15 21:13:11 · 149 阅读 · 0 评论 -
剑指 Offer 14- I. 剪绳子
文章目录题目描述方法一:动态规划思路代码题目描述方法一:动态规划思路定义一个一维数组 dp,dp[i] 表示 长度为 i 的绳子所有分段方式中各段乘积的最大值;由于绳长和所分段数都是整数且大于1,所以初始化 dp[2] = 1;对于长度为 i 的绳子,第一段可分的长度为 1 至 i - 1,由于 1 对于最终各段的乘积没有贡献,所以可分段为 2 至 i - 1,若第一段被分的长度为 j (1 < j < i),则其各段乘积最大值要么是分为两段的 j * (i - j),要么是被分原创 2021-05-10 20:34:23 · 161 阅读 · 0 评论 -
剑指 Offer 15. 二进制中1的个数
文章目录题目描述方法一:循环右移思路代码题目描述方法一:循环右移思路使用计数器 cnt 来记录二进制串 n 中 1 的个数,将 n 与 1 按位与操作,若结果为 1 ,则在 n 中该位的值为 1,将计数器加一,然后将 n 右移一位,直至 n 为 0 时结束。代码class Solution {public: int hammingWeight(uint32_t n) { int cnt = 0; while (n) { cnt原创 2021-05-10 11:39:56 · 65 阅读 · 0 评论 -
剑指 Offer 24. 反转链表
文章目录题目描述方法一:循环题目描述方法一:循环/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(x), next(NULL) {} * }; */class Solution {public: ListNode* reverseList(ListNode* head) {原创 2021-04-29 20:44:35 · 70 阅读 · 0 评论 -
剑指 Offer 13. 机器人的运动范围
文章目录题目描述方法一:DFS思路代码题目描述方法一:DFS思路使用 visited 记录是否已遍历,然后 DFS 递归遍历:在不满足条件时返回 0,满足时标记该位置,计数加一并递归下去。mysum 计算两个数字的数位和。代码class Solution {public: int movingCount(int m, int n, int k) { vector<vector<bool>> visited(m, vector<bool&g原创 2021-04-28 20:30:05 · 85 阅读 · 0 评论 -
633. 平方数之和
文章目录题目描述方法一:顺序遍历思路:代码:方法二:碰撞指针思路代码题目描述方法一:顺序遍历思路:定义变量 a 从 0 到 sqrt(c)遍历,判断 c - a * a 的开方是不是个整数,如果是,则存在两个整数满足题意,若遍历结束还没有,则不存在。代码:class Solution {public: bool judgeSquareSum(int c) { for (long a = 0; a * a <= c; ++a) { doub原创 2021-04-28 17:23:02 · 72 阅读 · 0 评论 -
剑指 Offer 07. 重建二叉树
文章目录题目描述代码题目描述代码/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */class Solution {public: TreeNode* b原创 2021-04-26 11:30:08 · 79 阅读 · 0 评论 -
剑指 Offer 12. 矩阵中的路径
文章目录题目描述方法一:dfs思路代码参考资料题目描述方法一:dfs思路遍历二维数组 board,从每个点开始深度优先搜索,若找到和 word 相等的字符串,则返回 true;若遍历结束都没有找到,则返回 false;深度优先的实现:参数含义:board:题目中二维字符网格;word:题目中目标字符串;r,c,k:其中 i,j 是当前搜索的位置,即现在判断 board[i][j] 的位置是否满足和 word 的第 k 个元素相等递归过程:首先写明递归的结束条件:当遍历原创 2021-04-25 19:52:19 · 98 阅读 · 0 评论 -
剑指 Offer 09. 用两个栈实现队列
文章目录题目描述方法一思路:代码:题目描述方法一思路:定义一个栈成员变量 s;对于 appendTail 方法,直接将 value 压入栈 s 中;对于 deleteHead 方法:首先判断栈 s 是否为空,若空,则说明队列中没有元素,直接返回 -1;定义一个临时的栈 tmp,将栈 s 中的元素依次弹出并压入 tmp 中,直至栈 s 为空,此时 tmp 的栈顶就是队列的首元素,将该元素备份,然后出栈。接着将 tmp 中的元素在依次压入栈 s 中。代码:class CQueue原创 2021-04-25 10:44:04 · 110 阅读 · 0 评论 -
剑指 Offer 06. 从尾到头打印链表
文章目录题目描述方法一:递归思路代码方法二:栈思路代码题目描述方法一:递归思路代码/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(x), next(NULL) {} * }; */class Solution {public: vector<int> v;原创 2021-04-25 09:31:52 · 63 阅读 · 0 评论 -
剑指 Offer 05. 替换空格
文章目录题目描述方法一:额外申请空间思路代码题目描述方法一:额外申请空间思路额外定义一个 string 类型的字符串 str 用于保存替换后的字符串,然后遍历字符串 s,当 s[i] 不是空格时,直接将 s[i] 赋值给 str[i],当 s[i] 是空格时,在 str 后面添加字符串 “%20”。代码class Solution {public: string replaceSpace(string s) { string str; for (int原创 2021-04-25 08:44:21 · 156 阅读 · 0 评论 -
剑指 Offer 57. 和为s的两个数字
文章目录题目描述方法一:使用 set思想:代码题目描述方法一:使用 set思想:遍历数组,如果 target - nums[i] 在 set 中,则 nums[i] 和 target-nums[i] 就是所求的数;如果不在 set 中,则将 nums[i] 存到set中。这样只需要花费 O(N) 的时间复杂度,不过需要 O(N)的复杂度。代码class Solution {public: vector<int> twoSum(vector<int>&原创 2021-04-22 10:58:14 · 87 阅读 · 0 评论 -
剑指 Offer 11. 旋转数组的最小数字
文章目录题目描述方法一:倒序顺序遍历思想代码题目描述在这里插入图片描述方法一:倒序顺序遍历思想从数组的后面开始遍历,遇到前面的元素大于该元素时,该元素就是最小值,如果遍历到第二个元素还没有找到,那么第一个元素就是最小值。代码class Solution {public: int minArray(vector<int>& numbers) { for (int i = numbers.size()-1; i >0; --i) {原创 2021-04-22 10:14:28 · 86 阅读 · 0 评论 -
剑指 Offer 10- II. 青蛙跳台阶问题
文章目录题目描述方法代码题目描述方法代码class Solution {public: int numWays(int n) { int f1 = 1, f2 = 1, f; if (n <= 1) { return 1; } for (int i = 1; i < n; ++i) { f = (f1 + f2) % 1000000007;原创 2021-04-22 09:24:20 · 139 阅读 · 0 评论 -
剑指 Offer 10- I. 斐波那契数列
文章目录题目描述代码题目描述代码class Solution {public: int fib(int n) { int f1 = 0, f2 = 1, f; if (n <= 1) { return n; } for (int i = 1; i < n; ++i) { f = (f1 + f2) % 1000000007;原创 2021-04-22 09:09:13 · 67 阅读 · 0 评论 -
剑指 Offer 04. 二维数组中的查找
文章目录题目描述方法一:顺序查找+折半查找思路代码题目描述方法一:顺序查找+折半查找思路首先顺序查找 target 可能在的行,因为只有某行的最小值小于等于 target,最大值大于等于 target 时,target 才可能在该行,然后对改行进行折半查找。代码class Solution {public: bool findNumberIn2DArray(vector<vector<int>>& matrix, int target) {原创 2021-04-21 11:28:55 · 116 阅读 · 0 评论 -
剑指 Offer 03. 数组中重复的数字
文章目录题目描述方法一:使用 set思路:代码:题目描述方法一:使用 set思路:定义一个 set,遍历 vector nums ,如果 nums[i] 在 set 中,则 nums[i] 就是重复值,否则,将 nums[i] 放入 set 中,直至遍历结束。代码:class Solution {public: int findRepeatNumber(vector<int>& nums) { set<int> s; f原创 2021-04-21 10:46:23 · 75 阅读 · 0 评论 -
1025. 除数博弈
文章目录题目描述方法一:逻辑分析题目描述方法一:逻辑分析思路:若A(爱丽丝)拿到的是偶数,她可以减一,让B(鲍勃)拿到的一直是奇数,那么B只能取一个奇数因子,奇数减去奇数是偶数,这样A拿到的一直是偶数,直至A拿到2,减去一,A胜利;若A拿到的是奇数,她只能取一个奇数因子,两个奇数的差是偶数,B只需一直减一,使得A拿到的一直是奇数,B一直拿到偶数,直至B拿到2,减去一,A失败。所以只需判断 n 是奇数还是偶数即可。代码:class Solution {public: bool原创 2021-04-19 21:23:47 · 241 阅读 · 0 评论 -
面试题 08.01. 三步问题
文章目录题目描述方法一:动态规划思路代码题目描述方法一:动态规划思路改题存在如下递推关系:f(n) = f(n-1) + f(n-2) + f(n-3)即上 n 个台阶的总方式数等于跳一个台阶到最后一个台阶的方式数,加上跳两个台阶到最后一个台阶的方式数,再加上跳三个台阶到最后一个台阶的方式数。相当于“三阶斐波那契数”。初始化:f1= 1,f2=2,f3=4迭代实现的代码如下,由于结果可能很大,所以f1,f2,f2,fn的类型定义为long,并且在每次计算fn时做了取余操作。该题递归实现原创 2021-04-19 19:21:26 · 119 阅读 · 0 评论 -
64. 最小路径和
文章目录题目描述方法一:动态规划题目描述方法一:动态规划代码:class Solution {public: int minPathSum(vector<vector<int>>& grid) { int i, j; vector<vector<int>> dp(grid.size()); for (i = 0; i < grid.size(); ++i) { // 定义 dp原创 2021-04-19 11:16:34 · 94 阅读 · 0 评论 -
面试题 17.16. 按摩师
文章目录题目描述方法一:动态规划题目描述方法一:动态规划代码:class Solution {public: int massage(vector<int>& nums) { int i; vector<int> dp; if (nums.size() == 0) { return 0; } else if (nums.size() == 1) {原创 2021-04-19 10:55:25 · 85 阅读 · 0 评论 -
70. 爬楼梯
文章目录题目描述方法一:递归实现方法二:迭代实现题目描述方法一:递归实现注: 该题递归实现会超时代码:class Solution {public: int climbStairs(int n) { if (n <= 2) { return n; } return climbStairs(n-1) + climbStairs(n-2); }};方法二:迭代实现class Solution {publ原创 2021-04-18 20:45:09 · 67 阅读 · 0 评论 -
53. 最大子序和
文章目录题目描述方法一:暴力枚举题目描述方法一:暴力枚举代码:class Solution {public: int maxSubArray(vector<int>& nums) { int sum, max = nums[0]; for (int i = 0; i < nums.size(); ++i) { sum = nums[i]; if (sum > max) {原创 2021-04-11 15:32:10 · 87 阅读 · 0 评论 -
35. 搜索插入位置
文章目录题目描述方法一:二分查找题目描述方法一:二分查找代码:class Solution {public: int searchInsert(vector<int>& nums, int target) { int left = 0, right = nums.size() - 1; while (left <= right) { int mid = (left + right) / 2;原创 2021-04-11 11:17:53 · 89 阅读 · 0 评论 -
27. 移除元素
文章目录题目描述方法题目描述方法思路: 快慢指针代码实现class Solution {public: int removeElement(vector<int>& nums, int val) { int k = 0; for (int i = 0; i < nums.size(); ++i) { if (nums[i] != val) { nums[k++] = num原创 2021-04-11 10:42:37 · 72 阅读 · 0 评论 -
26. 删除有序数组中的重复项
文章目录题目描述方法一题目描述方法一思路:使用 k 记录当前不重复的应放在的位置,并初始化为1判断数组是否为空,如果为空,则直接返回0;如果不为空,第一个元素一定不与前面的元素重复,这也是 k 初始化为1的原因;遍历数组 nums,如果 nums[i] 一直与前面的元素重复,则 ++i 跳过,使用 while 循环实现该过程,当 while 循环结束时,若数组没有遍历完,则碰到了一个不与前面元素相同的值,放入nums[k] 中,++k;代码实现:class Solution {pub原创 2021-04-11 10:10:40 · 329 阅读 · 0 评论 -
1. 两数之和
题目描述代码实现class Solution {public: vector<int> twoSum(vector<int>& nums, int target) { for (int i = 0; i < nums.size() - 1; ++i) { for (int j = i + 1; j < nums.size(); ++j) { if (nums[i] + nums原创 2021-04-10 22:19:03 · 79 阅读 · 0 评论 -
14.最长公共前缀
最长公共前缀题目描述题解题目描述题解char * longestCommonPrefix(char ** strs, int strsSize){ int i = 0, j = 0; bool flag = true; if (strsSize == 0) { return ""; } if (strsSize == 1) { return strs[0]; } while (j < strlen(strs原创 2020-09-18 09:14:54 · 130 阅读 · 0 评论