LeetCode Everyday
dblinux
DBL && XLB
展开
-
大数相加 + 大数相乘
1. 大数相加题目描述:以字符串的形式读入两个数字,编写一个函数计算它们的和,以字符串形式返回。思路:从后往前依次加两个字符串的数字,保留其进位,与下次相加结果再进行相加,直到两个都计算完。最后判断进位是否1(如果有进位的话,一定是1),若有进位,加上去即可。string solve(string s, string t) { // write code here int carry = 0, tmp1 = 0, tmp2 = 0; int n1 = s原创 2021-08-29 10:09:12 · 334 阅读 · 0 评论 -
53. 对称二叉树
1. 题目描述给定一个二叉树,检查它是否是镜像对称的。2. 基础解法思路:递归。准备两个相同的树,分别递归比较一棵树的左子树和另一棵树的右子树。迭代:还是准备两个相同的树,不过分别将树1的左子树、树2的右子树、树2的左子树、树1的右子树分别压入队列中。然后分别对队列头的前两个元素作比较,若不一致,则false,否则,一直到队列为空。// 递归class Solution {public: bool isSymmetric(TreeNode* root) { retur原创 2021-06-16 16:08:35 · 54 阅读 · 0 评论 -
52. 验证二叉搜索树
1. 题目描述给定一个二叉树,判断其是否是一个有效的二叉搜索树。假设一个二叉搜索树具有如下特征:节点的左子树只包含小于当前节点的数。节点的右子树只包含大于当前节点的数。所有左子树和右子树自身必须也是二叉搜索树。来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/validate-binary-search-tree著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。2. 基础解法思路:递归。如果该二叉树的左子树不为空,则原创 2021-06-15 13:53:02 · 76 阅读 · 0 评论 -
51. 不同的二叉搜索树II
1. 题目描述给你一个整数 n ,请你生成并返回所有由 n 个节点组成且节点值从 1 到 n 互不相同的不同 二叉搜索树 。可以按 任意顺序 返回答案。2. 基础解法思路:递归。先从简单的看起:根据[1, n]序列构造任意一个二叉搜索树可以在[1, n]序列中选任意一个数m为根,则以[1, m-1]为左子树,[m+1, n]为右子树,即可保证二叉搜索树的性质可以发现,左右子树也可以 根据[序列] 构造 [二叉搜索树],那么 递归 二字就呼之欲出了设定递归边界:序列区间不可用,即左区间大于右区原创 2021-06-09 15:46:16 · 107 阅读 · 0 评论 -
50. 不同的二叉搜索树
1. 题目描述给你一个整数 n ,求恰由 n 个节点组成且节点值从 1 到 n 互不相同的 二叉搜索树 有多少种?返回满足题意的二叉搜索树的种数。2. 基础解法思路:动态规划。设定状态:dp[i] : i个节点存在的二叉搜索树的个数。令f(i)表示为以i为根节点的二叉搜索树的个数。则有:dp[n] = f(1) + f(2) + … + f(n);当i为根节点时,其左子树节点个数为[1, 2, …, i - 1],右子节点个数为[i + 1, i + 2,…, n]。所以当i为根节点时,其左子原创 2021-06-08 15:31:36 · 85 阅读 · 0 评论 -
49. 二叉树的中序遍历
1. 题目描述给定一个二叉树的根节点 root ,返回它的 中序 遍历。2. 基础解法思路1:递归。思路2:使用栈来辅助。思路1:class Solution { public: vector<int> res; vector<int> inorderTraversal(TreeNode* root) { dfs(root, res); return res; } void dfs(TreeN原创 2021-06-07 17:25:26 · 64 阅读 · 0 评论 -
48. 旋转链表II
1. 题目描述给你单链表的头指针 head 和两个整数 left 和 right ,其中 left <= right 。请你反转从位置 left 到位置 right 的链表节点,返回 反转后的链表 。来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/reverse-linked-list-ii著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。2. 基础解法思路:以1->2->3->4->5,原创 2021-06-06 11:11:25 · 46 阅读 · 0 评论 -
47. 解码方法
1. 题目2. 分析动态规划:dp[i]表示s的前i个字符解码的个数,dp[i+1]对应s[i]及以前的字符解码个数,当s[i-1]==‘2’&&s[i]<=‘6’,这两个字符合起来也是一种解码方式属于区间[20,26],所以dp[i+1]需要加上dp[i-1]。实际上有两个约束条件:0不能单独解码两位数必须在1与26之间。这道题目实际上是用DP去做,仔细想的话,可以发现就是约束版的f(n) = f(n-1) + f(n-2); 其中如果是s[n-1]为0,原创 2021-06-05 16:32:22 · 57 阅读 · 0 评论 -
46. 子集II
1. 题目给你一个整数数组 nums ,其中可能包含重复元素,请你返回该数组所有可能的子集(幂集)。解集 不能 包含重复的子集。返回的解集中,子集可以按 任意顺序 排列。来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/subsets-ii著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。2. 分析相似题目:子集本题作为子集的升级版,唯一升级的就是需要去重,其他完全一样。怎么去重?判断现在索引到的数据与之前的那个是否一原创 2021-06-04 17:11:50 · 57 阅读 · 0 评论 -
45. 合并两个有序数组
1. 题目给你两个有序整数数组 nums1 和 nums2,请你将 nums2 合并到 nums1 中,使 nums1 成为一个有序数组。初始化 nums1 和 nums2 的元素数量分别为 m 和 n 。你可以假设 nums1 的空间大小等于 m + n,这样它就有足够的空间保存来自 nums2 的元素。来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/merge-sorted-array著作权归领扣网络所有。商业转载请联系官方授权,非商业转载原创 2021-06-03 19:05:33 · 83 阅读 · 0 评论 -
44. 分隔链表
1. 题目给你一个链表的头节点 head 和一个特定值 x ,请你对链表进行分隔,使得所有 小于 x 的节点都出现在 大于或等于 x 的节点之前。你应当 保留 两个分区中每个节点的初始相对位置。来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/partition-list著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。2. 分析 就是让你用两个链表存,第一个存<target的结点,第二个存>=target原创 2021-06-02 11:22:44 · 77 阅读 · 0 评论 -
43. 删除链表中的重复节点
1. 题目存在一个按升序排列的链表,给你这个链表的头节点 head ,请你删除所有重复的元素,使每个元素 只出现一次 。返回同样按升序排列的结果链表。2. 分析递归:找终止条件:当head指向链表只剩一个元素的时候,自然是不可能重复的,因此return;想想应该返回什么值:应该返回的自然是已经去重的链表的头节点;每一步要做什么:宏观上考虑,此时head.next已经指向一个去重的链表了,而根据第二步,我应该返回一个去重的链表的头节点。因此这一步应该做的是判断当前的head和head.ne原创 2021-06-01 15:05:47 · 202 阅读 · 0 评论 -
42. 单词搜索
1. 题目给定一个 m x n 二维字符网格 board 和一个字符串单词 word 。如果 word 存在于网格中,返回 true ;否则,返回 false 。单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的字母不允许被重复使用。来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/word-search著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。2原创 2021-05-31 15:23:37 · 58 阅读 · 0 评论 -
41.子集
1. 题目给你一个整数数组 nums ,数组中的元素 互不相同 。返回该数组所有可能的子集(幂集)。解集 不能 包含重复的子集。你可以按 任意顺序 返回解集。 子集2. 分析经典的回溯法。对于每个元素,只有两种选择:选择或者不选择。细节实现:为了避免多传参数,可以将res设为全局变量;同理nums的size也是如此。代码如下:class Solution {public: vector<vector<int>> res; // 全局变量 int原创 2021-05-29 15:52:48 · 66 阅读 · 0 评论 -
40. 颜色分类
1. 题目给定一个包含红色、白色和蓝色,一共 n 个元素的数组,原地对它们进行排序,使得相同颜色的元素相邻,并按照红色、白色、蓝色顺序排列。此题中,我们使用整数 0、 1 和 2 分别表示红色、白色和蓝色。来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/sort-colors2. 分析直接sort就有点过分了????思想:双指针 + 快排思想。在遍历的过程中,我们需要找出所有的 0 交换至数组的头部,并且找出所有的 2 交换至数组的尾部原创 2021-05-28 16:05:14 · 80 阅读 · 0 评论 -
39. 爬楼梯
1. 题目假设你正在爬楼梯。需要 n 阶你才能到达楼顶。每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?注意:给定 n 是一个正整数。2. 分析不必多说,斐波那契数列!!参考链接:https://blog.csdn.net/qq_45434780/article/details/116798291代码如下: int climbStairs(int n) { if(n <= 0) return -1;原创 2021-05-27 16:11:56 · 61 阅读 · 0 评论 -
38. mySqrt
1. 题目实现 int sqrt(int x) 函数。计算并返回 x 的平方根,其中 x 是非负整数。由于返回类型是整数,结果只保留整数的部分,小数部分将被舍去。来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/sqrt2. 分析二分法:设定最大平方根值是自己,最小为0;取均值m,去测试x与m的平方大小关系,若后者更大,说明max大了,将其设为中值m,等待下一次去均值将其减小;若前者更大,说明min小了,将其设置为中值m,等待下次折中原创 2021-05-26 14:26:18 · 451 阅读 · 0 评论 -
37. 加一
1. 题目给定一个由 整数 组成的 非空 数组所表示的非负整数,在该数的基础上加一。最高位数字存放在数组的首位, 数组中每个元素只存储单个数字。你可以假设除了整数 0 之外,这个整数不会以零开头。来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/plus-one2. 分析本题分两种情况:至少有一位不为9,在这种情况下,我们从尾往头加,再加1之前判断是否是9,若是,则将该位置0;若不是,将该位加1,返回数组。数组数字全为9:在此情况下,原创 2021-05-25 16:37:49 · 64 阅读 · 0 评论 -
36. 最小路径和
题目给定一个包含非负整数的 m x n 网格 grid ,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小。说明:每次只能向下或者向右移动一步。分析dp[i][j]:当有i行j列时候的最小路径和。先初始化每行每列的和;利用初始化的值,dp算法求出所有路径中的最小值。 int minPathSum(vector<vector<int>>& grid) { int row = grid.size(); int原创 2021-05-24 16:29:58 · 60 阅读 · 0 评论 -
35. 不同路径
1. 题目描述一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为 “Start” )。机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为 “Finish” )。问总共有多少条不同的路径?来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/unique-paths著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。2. 基础解法思路:动态规划。设定dp数组:dp[i][j]:原创 2021-05-22 16:35:25 · 46 阅读 · 0 评论 -
34. 旋转链表
1. 题目描述给你一个链表的头节点 head ,旋转链表,将链表每个节点向右移动 k 个位置。2. 基础解法思路:不是要将每个节点都移动 k 步,而是改变头指针指向即可。(当非空链表且k != 0)要求移动k步节点,我们只需要找到倒数第k+1个节点,那么这个节点的下一个节点就是新头指针,之后,这个节点的下一个指针要置空,表示链表的结束。算法按照以下步骤进行当链表为空或者仅有一个节点,直接返回head;若k == 0,说明不用翻转,故也返回head;遍历一遍链表,有两个作用:一是用来查看该链表有原创 2021-05-21 16:37:15 · 374 阅读 · 0 评论 -
33. 合并区间
1. 题目描述以数组 intervals 表示若干个区间的集合,其中单个区间为 intervals[i] = [starti, endi] 。请你合并所有重叠的区间,并返回一个不重叠的区间数组,该数组需恰好覆盖输入中的所有区间。来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/merge-intervals著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。2. 基础解法思路:排序 + 双指针。当区间个数小于2个时候,即不原创 2021-05-20 17:24:48 · 111 阅读 · 0 评论 -
32. 跳跃游戏
1. 题目描述给定一个非负整数数组 nums ,你最初位于数组的 第一个下标 。数组中的每个元素代表你在该位置可以跳跃的最大长度。判断你是否能够到达最后一个下标。2. 基础解法思路:判断到下一个格子,检查自身存储的数字与格子数字哪个大,取较大的那个;同时当前存储的数字不能是0(即不能再走了);最后判断是否能走到终点即可。 bool canJump(vector<int>& nums) { int size = nums.size();原创 2021-05-19 20:00:31 · 68 阅读 · 1 评论 -
31. 螺旋矩阵
1. 题目描述给你一个 m 行 n 列的矩阵 matrix ,请按照 顺时针螺旋顺序 ,返回矩阵中的所有元素。螺旋矩阵2. 基础解法思路:控制好上下左右四个边界,每遍历完一行或者一列,就将相应的边界减一,避免再次被访问到。同时要进行判断,左边界不能大于右边界,上边界不能大于下边界。 vector<int> spiralOrder(vector<vector<int>>& matrix) { int row = matrix.siz原创 2021-05-18 22:38:09 · 111 阅读 · 0 评论 -
30. 最大子序和
1. 题目描述给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。2. 基础解法思路:动态规划。我刚看到这个题,以为是要使用滑动窗口算法来做,但是仔细一想不可以,因为数组中的数字可以是负数。当窗口扩大的时候可能遇到负数,窗口中的值可能增大可能减小,故不知道以什么时机去收缩左侧窗口,也就无法求最值。本题dp[i]定义:以nums[i]为结尾的“最大子数组和”。需要遍历整个数组才能得到最大子数组和。int res = INT_MIN;for(in原创 2021-05-17 17:15:55 · 51 阅读 · 0 评论 -
29. myPow
1. 题目描述实现 pow(x, n) ,即计算 x 的 n 次幂函数(即,xn)。链接:https://leetcode-cn.com/problems/powx-n/2. 解法思路:本题主要意思是要求递归快速幂。快速幂就是快速算底数的n次幂。其时间复杂度为 O(log₂N), 与朴素的O(N)相比效率有了极大的提高。快速幂算法的核心思想就是每一步都把指数分成两半,而相应的底数做平方运算。这样不仅能把非常大的指数给不断变小,所需要执行的循环次数也变小,而最后表示的结果却一直不会变。 d原创 2021-05-15 21:04:11 · 474 阅读 · 0 评论 -
28. 字母异位词分组
1. 题目描述给定一个字符串数组,将字母异位词组合在一起。字母异位词指字母相同,但排列不同的字符串。示例:输入: [“eat”, “tea”, “tan”, “ate”, “nat”, “bat”]输出:[[“ate”,“eat”,“tea”],[“nat”,“tan”],[“bat”]]说明:所有输入均为小写字母。不考虑答案输出的顺序。来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/group-anagrams著作权归领扣原创 2021-05-14 17:14:18 · 71 阅读 · 0 评论 -
27. 旋转图像
1. 题目描述给定一个 n × n 的二维矩阵 matrix 表示一个图像。请你将图像顺时针旋转 90 度。你必须在 原地 旋转图像,这意味着你需要直接修改输入的二维矩阵。请不要 使用另一个矩阵来旋转图像。来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/rotate-image著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。2. 解法思路:找到一个大佬的新奇思路,先上下反转图像,即第1行换最后一行,第二行换倒数第二原创 2021-05-13 21:08:32 · 49 阅读 · 0 评论 -
26. 全排列
1. 题目描述给定一个 没有重复 数字的序列,返回其所有可能的全排列。2. 解法思路:回溯 + 剪枝。class Solution {public: vector<vector<int>> permute(vector<int>& nums) { dfs(nums, 0); return res; } vector<int> tmp; vector<vector<in原创 2021-05-12 18:51:49 · 87 阅读 · 0 评论 -
25. 组合总数 II
1. 题目描述给定一个数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。candidates 中的每个数字在每个组合中只能使用一次。说明:所有数字(包括目标数)都是正整数。解集不能包含重复的组合。来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/combination-sum-ii著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。2. 解法原创 2021-05-11 18:48:12 · 98 阅读 · 0 评论 -
24. 组合总数
1. 题目描述给定一个无重复元素的数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。candidates 中的数字可以无限制重复被选取。说明:所有数字(包括 target)都是正整数。解集不能包含重复的组合。来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/combination-sum著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。2.原创 2021-05-10 15:33:49 · 225 阅读 · 0 评论 -
23. 外观数组_
1. 题目描述给定一个正整数 n ,输出外观数列的第 n 项。「外观数列」是一个整数序列,从数字 1 开始,序列中的每一项都是对前一项的描述。你可以将其视作是由递归公式定义的数字字符串序列:countAndSay(1) = “1”countAndSay(n) 是对 countAndSay(n-1) 的描述,然后转换成另一个数字字符串。前五项如下:1 11 21 1211 111221第一项是数字 1描述前一项,这个数是 1 即 “ 一 个 1原创 2021-05-09 16:18:16 · 66 阅读 · 0 评论 -
22. 搜索插入位置__
1. 题目描述给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。你可以假设数组中无重复元素。示例 1:输入: [1,3,5,6], 5输出: 2示例 2:输入: [1,3,5,6], 2输出: 1示例 3:输入: [1,3,5,6], 7输出: 4示例 4:输入: [1,3,5,6], 0输出: 0来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/sear原创 2021-05-08 19:24:31 · 49 阅读 · 0 评论 -
21. 在排序数组中查找元素的第一个和最后一个位置
1. 题目描述给定一个按照升序排列的整数数组 nums,和一个目标值 target。找出给定目标值在数组中的开始位置和结束位置。如果数组中不存在目标值 target,返回 [-1, -1]。进阶:你可以设计并实现时间复杂度为 O(log n) 的算法解决此问题吗?来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/find-first-and-last-position-of-element-in-sorted-array2. 解法思路:首先原创 2021-05-07 17:58:09 · 51 阅读 · 0 评论 -
19. 下一个排列_
1. 题目描述实现获取 下一个排列 的函数,算法需要将给定数字序列重新排列成字典序中下一个更大的排列。如果不存在下一个更大的排列,则将数字重新排列成最小的排列(即升序排列)。必须 原地 修改,只允许使用额外常数空间。来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/next-permutation2. 解法思路:c++ 的 next_permutation()真香;当nums是降序的时候,就不存在更大的排列; 将nums从小到大排列。 否在原创 2021-05-06 21:20:03 · 46 阅读 · 0 评论 -
18. 删除有序数组中的重复项
1. 题目描述给你一个有序数组 nums ,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。不要使用额外的数组空间,你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下完成。示例 1:输入:nums = [1,1,2]输出:2, nums = [1,2]解释:函数应该返回新的长度 2 ,并且原数组 nums 的前两个元素被修改为 1, 2 。不需要考虑数组中超出新长度后面的元素。示例 2:输入:nums = [0,0,1,1,1,2,2,3,3原创 2021-04-27 21:09:00 · 174 阅读 · 0 评论 -
17. 两两交换链表中的节点
1. 题目描述给定一个链表,两两交换其中相邻的节点,并返回交换后的链表。你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。示例 1:输入:head = [1,2,3,4]输出:[2,1,4,3]示例 2:输入:head = []输出:[]示例 3:输入:head = [1]输出:[1]提示:链表中节点的数目在范围 [0, 100] 内0 <= Node.val <= 100来源:力扣(LeetCode)链接:https://leetcode-cn.co原创 2021-04-26 16:55:26 · 57 阅读 · 0 评论 -
17. 两两交换链表中的节点
1. 题目描述给定一个链表,两两交换其中相邻的节点,并返回交换后的链表。你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。示例 1:输入:head = [1,2,3,4]输出:[2,1,4,3]示例 2:输入:head = []输出:[]示例 3:输入:head = [1]输出:[1]提示:链表中节点的数目在范围 [0, 100] 内0 <= Node.val <= 100来源:力扣(LeetCode)链接:https://leetcode-cn.co原创 2021-04-25 21:07:28 · 54 阅读 · 0 评论 -
16. 括号生成
1. 题目描述数字 n 代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且 有效的 括号组合。示例 1:输入:n = 3输出:["((()))","(()())","(())()","()(())","()()()"]示例 2:输入:n = 1输出:["()"]提示:1 <= n <= 8来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/generate-parentheses2. 解法关于括号问题:有两原创 2021-04-24 19:58:03 · 84 阅读 · 0 评论 -
15. 合并两个有序链表
1. 题目描述将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。https://leetcode-cn.com/problems/merge-two-sorted-lists/2. 解法思路:递归法。首先明确递归三要素,即这个递归函数功能是什么、递归结束条件是什么、寻找函数等价的关系式。talk is cheap,show me the code!// 函数功能:合并两个有序链表ListNode* mergeTwoLists(ListNode* l原创 2021-04-23 20:08:04 · 61 阅读 · 0 评论