-
计算两个链表中的数值之和
https://leetcode-cn.com/problems/add-two-numbers/submissions/
思路:初始化首尾两个指针,然后每一位相加,同时不能忘记进位。 -
利用回溯算法解决树状组合问题
https://leetcode-cn.com/problems/letter-combinations-of-a-phone-number/submissions/ -
判断括号是否是对称的
https://leetcode-cn.com/problems/valid-parentheses/submissions/
这个题目和最大回文字符串不同,关注点是整个系统,因此使用栈的方法进行判断更加容易。 -
将两个链表所有的元素按照大小进行排列
https://leetcode-cn.com/problems/merge-two-sorted-lists/submissions/
方法1递归,每一次,都是由较小的一方指向较大的一方,直到一方为空返回。
方法2循环,新建链表,对每一个node进行判断。 -
括号生成
https://leetcode-cn.com/problems/generate-parentheses/submissions/
仍然是回溯算法,也可以使用迭代然后再过滤。
或者是基于迭代的方法秒首先找到所有的组合,然后判断是否符合条件,符合条件的返回。 -
返回下一个最大的数字
https://leetcode-cn.com/problems/next-permutation/submissions/
首先从数组尾部开始遍历找到一对相邻的升序组合[num[i],num[i+1]],然后从尾部找到一个数字num[j]>num[i],交换i,j之间的顺序,然后j之前的数字升序排列。PS:题库中验证包含着两数相等的情况,如果只考虑开区间过不了。 -
二分法寻找目标
https://leetcode-cn.com/problems/search-in-rotated-sorted-array/submissions/
二分法的好处在于可以减少近一半的时间复杂度。
也就是首先判断目标在左边还是右边,然后只搜索一半的空间。因而可以节约近一半的时间。 -
组合的总数
https://leetcode-cn.com/problems/combination-sum/submissions/
这个题目要求我们 -
旋转图像
https://leetcode-cn.com/problems/rotate-image/submissions/
题目中给出的是一个二维矩阵,图像是一个关于灰度值的二维矩阵,所以给定一个矩阵,相当于给定了一个图像。方法一找到每一个元素旋转前的位置和旋转后位置之间的联系,从而建立一个新的矩阵,用来储存旋转后的元素。将新的矩阵替换原有的矩阵。
方法二,报错,但我人为逻辑上是正确的,即将每一行的数据作为旋转后某一列的数据,但是这个列如何通过容器去表示还是值得商榷的。 -
返回字母元素相同的子集
https://leetcode-cn.com/problems/group-anagrams/submissions/
这个问题采用了hash表,同时又多掌握了一个知识点,sort(string.begin(),string.end())可以将字符串进行归一化,也就是不同顺序的字符按照相同顺序排列后可以得到唯一的key。 -
跳跃游戏
https://leetcode-cn.com/problems/jump-game/submissions/
这是一个基于贪心算法的题目,表面上很简单但是落实起来不太容易,它的思想在于最大化指针所能到达的距离,而约束条件在每一个位置处,这是其中的难点。 -
合并区间
https://leetcode-cn.com/problems/merge-intervals/submissions/
这道题给我印象最深刻的地方在于需要对数组提前排序,排序后有意想不到的效果,如果不排序,则会相当之麻烦。 -
路径数目
https://leetcode-cn.com/problems/unique-paths/submissions/
这是一道动态规划题,递归式地统计从矩阵左上角到达右下角路径的数目 -
最短路径
https://leetcode-cn.com/problems/minimum-path-sum/submissions/
这题目是一个动态规划题,可以从右下角开始也可以从左上角开始。 -
爬楼梯
https://leetcode-cn.com/problems/climbing-stairs/solution/pa-lou-ti-by-leetcode-solution/
这道题是一个很有意思的问题,它支持多种解法,前提是你需要了解这是个斐波那契数列形式的结果。然后使用动态规划形式的方式去解答。同时动态规划有它的一个线性形式
即 ∣ 1 1 1 0 ∣ × ∣ f ( n ) f ( n − 1 ) ∣ |\begin{matrix}1&1\\1&0\end{matrix}|\times |\begin{matrix}f(n)\\ f(n-1)\end{matrix}| ∣1110∣×∣f(n)f(n−1)∣这样加法就转化为了乘法的递归形式,对于左侧的线性因子可以对其进行正交分解,然后进行乘法计算,不过有点多此一举了。 -
由小到大排序
https://leetcode-cn.com/problems/sort-colors/
第一种方法不讲伍德,直接sort,第二种{排序算法s} -
子集
https://leetcode-cn.com/problems/subsets/solution/
深度优先搜索,回溯算法。回溯对内存消耗比较小,而深度优先搜索对内存消耗比较大。 这一题我并未 -
二叉树中序遍历
https://leetcode-cn.com/problems/binary-tree-inorder-traversal/submissions/
中序遍历直观的理解就是每一个分支中左节点优先,这个过程通过语言难以描述。可以通过迭代的方式去解决问题或者递归式地去解决这个问题。 -
环形列表
https://leetcode-cn.com/problems/linked-list-cycle/
方法一使用一个哈希表,然后向其中插入元素,当某一个节点所指向的下一个节点已经出现过时,返回真。
方法二,快慢指针,这个想法真的是很妙,一个指针快,另一个指针慢,当两个指针重合时,终止遍历。其中补充一点,由于这个链表中存在着环路,所以二者一定可以相遇。
二者复杂度都属于O(N),但是很明显方法二的速度更快一些。 -
单词拆分
https://leetcode-cn.com/problems/word-break/submissions/
这个问题可以用来书写nlp的分词。用到了一个动态规划的方法,即上一个分词正确才可以接着进行分词。
构建一个容器,用来存储到某一个位置之前的字符串是否可以被切分。
思路如下:首先创建一个hash表,然后存储所有的单词索引。从句子的起点开始按照不同长度进行遍历,如果能搜索到某一个位置之前的分词,并且上一个分词是正确的,那么以该位置为索引处所对应的值为真。 -
找到只出现一次的数据
https://leetcode-cn.com/problems/single-number/
方法一,异或运算,因为只有一个数字出现一次,其余的数字均出现两次。
方法二,hash表。 -
最长连续序列
https://leetcode-cn.com/problems/longest-consecutive-sequence/solution/
暴力解法,从每一个字母处向下搜索,直到不再连续,统计返回最长的数列。 -
买股票的最佳时机
https://leetcode-cn.com/problems/best-time-to-buy-and-sell-stock/comments/
方法1暴力解法,直接两个循环解出结果。方法2一次遍历,在这一次遍历中不断地更新最小值。 -
将二叉树展开为只有右侧分支的树
https://leetcode-cn.com/problems/flatten-binary-tree-to-linked-list/submissions/
前序遍历,首先建立一个容器,然后将原二叉树按照前序遍历存储到容器中。然后说一下我遇到的错误,直接初始化一个节点并让节点的右侧不断指向容器中的元素。这样会报错。 -
返回二叉树的深度
https://leetcode-cn.com/problems/maximum-depth-of-binary-tree/solution/
第一种思想是回溯function即max(function(left),function(right))+1,如果没有节点则返回0,如果有节点则返回+1.
第二种思想是,找到二叉树的最大层数。思路是使用队列,因为队列可以做到先进先出的效果,所以可以让每一层的节点都进入队列中,当某一层没有任何节点时,终止迭代。 -
搜索不同的二叉树
https://leetcode-cn.com/problems/unique-binary-search-trees/
这是一个动态规划题,如果直接看答案可能摸不到头脑。但是如果你逐渐增加节点数,可以发现左右子树都可以通过已有的二叉树去表示,也就是分成子树的子数。同时假设左子树有n种形式,右子数有m种形式,那么左右子数共计mn种形式。 -
判断二叉树是否是镜像二叉树
https://leetcode-cn.com/problems/symmetric-tree/submissions/
方法一递归,递归的判断依据是左右指针所对应的值相同,同时指针所指向的下一个node的值也相同。
方法二迭代,创建一个队列后左右指针对应的元素依次进入队列,然后判断时需要按照镜像的方式进行判断。 -
判断一个容器记录的字符是否可以组成一个连续的字符串
https://leetcode-cn.com/problems/word-search/submissions/
这个题目采用回溯的方式进行判断。首先遍历容器,如果容器中的字符等于字符串中的第一个字符,则进行回溯。回溯的原理是如果在回溯的起点处向四周移动时,四个方向均没有字符串所对应的第二个字母,则返回假。反之则进行回溯,回溯目标是第三个字母,依次类推,当字符串中所有的字母均能在容器中找到位置,则证明可以在容器中组成输入的字符串。 -
返回i数组中和最大的连续子集
https://leetcode-cn.com/problems/maximum-subarray/submissions/
这个题有些地方没说清楚,这个连续是指的索引连续而不是值连续。这个问题由两种解决方法,第一种是动态规划问题,它的思路是,从开始出一直加和,直到和小于某一处的数值,然后从该处继续加和所以状态转移方程可以写为: add=max(add+nums[i],nums[i]).每次记录都会更新add的最大值,最后返回add的最大值。 -
三数值和为0
https://leetcode-cn.com/problems/3sum/comments/
这题的思路是两个数字的和确定第三个和,所以只需要略大于O(n^2)的时间就可以遍历完成,但是同样的思路我的程序没有通过测试,也是醉了。 -
验证二叉树
https://leetcode-cn.com/problems/validate-binary-search-tree/submissions/
这道题有两种解法,第一种方法就是回溯法,但是我不知道为何我的代码没有通关,第二种方法是中序遍历,因为如果按照中序遍历的话,所有的数值呈递增排列。
Leetcode hot 100题之前50题刷题记录
最新推荐文章于 2024-04-23 17:09:00 发布