Leetcode hot 100题之前50题刷题记录

  1. 计算两个链表中的数值之和
    https://leetcode-cn.com/problems/add-two-numbers/submissions/
    思路:初始化首尾两个指针,然后每一位相加,同时不能忘记进位。

  2. 利用回溯算法解决树状组合问题
    https://leetcode-cn.com/problems/letter-combinations-of-a-phone-number/submissions/

  3. 判断括号是否是对称的
    https://leetcode-cn.com/problems/valid-parentheses/submissions/
    这个题目和最大回文字符串不同,关注点是整个系统,因此使用栈的方法进行判断更加容易。

  4. 将两个链表所有的元素按照大小进行排列
    https://leetcode-cn.com/problems/merge-two-sorted-lists/submissions/
    方法1递归,每一次,都是由较小的一方指向较大的一方,直到一方为空返回。
    方法2循环,新建链表,对每一个node进行判断。

  5. 括号生成
    https://leetcode-cn.com/problems/generate-parentheses/submissions/
    仍然是回溯算法,也可以使用迭代然后再过滤。
    或者是基于迭代的方法秒首先找到所有的组合,然后判断是否符合条件,符合条件的返回。

  6. 返回下一个最大的数字
    https://leetcode-cn.com/problems/next-permutation/submissions/
    首先从数组尾部开始遍历找到一对相邻的升序组合[num[i],num[i+1]],然后从尾部找到一个数字num[j]>num[i],交换i,j之间的顺序,然后j之前的数字升序排列。PS:题库中验证包含着两数相等的情况,如果只考虑开区间过不了。

  7. 二分法寻找目标
    https://leetcode-cn.com/problems/search-in-rotated-sorted-array/submissions/
    二分法的好处在于可以减少近一半的时间复杂度。
    也就是首先判断目标在左边还是右边,然后只搜索一半的空间。因而可以节约近一半的时间。

  8. 组合的总数
    https://leetcode-cn.com/problems/combination-sum/submissions/
    这个题目要求我们

  9. 旋转图像
    https://leetcode-cn.com/problems/rotate-image/submissions/
    题目中给出的是一个二维矩阵,图像是一个关于灰度值的二维矩阵,所以给定一个矩阵,相当于给定了一个图像。方法一找到每一个元素旋转前的位置和旋转后位置之间的联系,从而建立一个新的矩阵,用来储存旋转后的元素。将新的矩阵替换原有的矩阵。
    方法二,报错,但我人为逻辑上是正确的,即将每一行的数据作为旋转后某一列的数据,但是这个列如何通过容器去表示还是值得商榷的。

  10. 返回字母元素相同的子集
    https://leetcode-cn.com/problems/group-anagrams/submissions/
    这个问题采用了hash表,同时又多掌握了一个知识点,sort(string.begin(),string.end())可以将字符串进行归一化,也就是不同顺序的字符按照相同顺序排列后可以得到唯一的key。

  11. 跳跃游戏
    https://leetcode-cn.com/problems/jump-game/submissions/
    这是一个基于贪心算法的题目,表面上很简单但是落实起来不太容易,它的思想在于最大化指针所能到达的距离,而约束条件在每一个位置处,这是其中的难点。

  12. 合并区间
    https://leetcode-cn.com/problems/merge-intervals/submissions/
    这道题给我印象最深刻的地方在于需要对数组提前排序,排序后有意想不到的效果,如果不排序,则会相当之麻烦。

  13. 路径数目
    https://leetcode-cn.com/problems/unique-paths/submissions/
    这是一道动态规划题,递归式地统计从矩阵左上角到达右下角路径的数目

  14. 最短路径
    https://leetcode-cn.com/problems/minimum-path-sum/submissions/
    这题目是一个动态规划题,可以从右下角开始也可以从左上角开始。

  15. 爬楼梯
    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(n1)这样加法就转化为了乘法的递归形式,对于左侧的线性因子可以对其进行正交分解,然后进行乘法计算,不过有点多此一举了。

  16. 由小到大排序
    https://leetcode-cn.com/problems/sort-colors/
    第一种方法不讲伍德,直接sort,第二种{排序算法s}

  17. 子集
    https://leetcode-cn.com/problems/subsets/solution/
    深度优先搜索,回溯算法。回溯对内存消耗比较小,而深度优先搜索对内存消耗比较大。 这一题我并未

  18. 二叉树中序遍历
    https://leetcode-cn.com/problems/binary-tree-inorder-traversal/submissions/
    中序遍历直观的理解就是每一个分支中左节点优先,这个过程通过语言难以描述。可以通过迭代的方式去解决问题或者递归式地去解决这个问题。

  19. 环形列表
    https://leetcode-cn.com/problems/linked-list-cycle/
    方法一使用一个哈希表,然后向其中插入元素,当某一个节点所指向的下一个节点已经出现过时,返回真。
    方法二,快慢指针,这个想法真的是很妙,一个指针快,另一个指针慢,当两个指针重合时,终止遍历。其中补充一点,由于这个链表中存在着环路,所以二者一定可以相遇。
    二者复杂度都属于O(N),但是很明显方法二的速度更快一些。

  20. 单词拆分
    https://leetcode-cn.com/problems/word-break/submissions/
    这个问题可以用来书写nlp的分词。用到了一个动态规划的方法,即上一个分词正确才可以接着进行分词。
    构建一个容器,用来存储到某一个位置之前的字符串是否可以被切分。
    思路如下:首先创建一个hash表,然后存储所有的单词索引。从句子的起点开始按照不同长度进行遍历,如果能搜索到某一个位置之前的分词,并且上一个分词是正确的,那么以该位置为索引处所对应的值为真。

  21. 找到只出现一次的数据
    https://leetcode-cn.com/problems/single-number/
    方法一,异或运算,因为只有一个数字出现一次,其余的数字均出现两次。
    方法二,hash表。

  22. 最长连续序列
    https://leetcode-cn.com/problems/longest-consecutive-sequence/solution/
    暴力解法,从每一个字母处向下搜索,直到不再连续,统计返回最长的数列。

  23. 买股票的最佳时机
    https://leetcode-cn.com/problems/best-time-to-buy-and-sell-stock/comments/
    方法1暴力解法,直接两个循环解出结果。方法2一次遍历,在这一次遍历中不断地更新最小值。

  24. 将二叉树展开为只有右侧分支的树
    https://leetcode-cn.com/problems/flatten-binary-tree-to-linked-list/submissions/
    前序遍历,首先建立一个容器,然后将原二叉树按照前序遍历存储到容器中。然后说一下我遇到的错误,直接初始化一个节点并让节点的右侧不断指向容器中的元素。这样会报错。

  25. 返回二叉树的深度
    https://leetcode-cn.com/problems/maximum-depth-of-binary-tree/solution/
    第一种思想是回溯function即max(function(left),function(right))+1,如果没有节点则返回0,如果有节点则返回+1.
    第二种思想是,找到二叉树的最大层数。思路是使用队列,因为队列可以做到先进先出的效果,所以可以让每一层的节点都进入队列中,当某一层没有任何节点时,终止迭代。

  26. 搜索不同的二叉树
    https://leetcode-cn.com/problems/unique-binary-search-trees/
    这是一个动态规划题,如果直接看答案可能摸不到头脑。但是如果你逐渐增加节点数,可以发现左右子树都可以通过已有的二叉树去表示,也就是分成子树的子数。同时假设左子树有n种形式,右子数有m种形式,那么左右子数共计mn种形式。

  27. 判断二叉树是否是镜像二叉树
    https://leetcode-cn.com/problems/symmetric-tree/submissions/
    方法一递归,递归的判断依据是左右指针所对应的值相同,同时指针所指向的下一个node的值也相同。
    方法二迭代,创建一个队列后左右指针对应的元素依次进入队列,然后判断时需要按照镜像的方式进行判断。

  28. 判断一个容器记录的字符是否可以组成一个连续的字符串
    https://leetcode-cn.com/problems/word-search/submissions/
    这个题目采用回溯的方式进行判断。首先遍历容器,如果容器中的字符等于字符串中的第一个字符,则进行回溯。回溯的原理是如果在回溯的起点处向四周移动时,四个方向均没有字符串所对应的第二个字母,则返回假。反之则进行回溯,回溯目标是第三个字母,依次类推,当字符串中所有的字母均能在容器中找到位置,则证明可以在容器中组成输入的字符串。

  29. 返回i数组中和最大的连续子集
    https://leetcode-cn.com/problems/maximum-subarray/submissions/
    这个题有些地方没说清楚,这个连续是指的索引连续而不是值连续。这个问题由两种解决方法,第一种是动态规划问题,它的思路是,从开始出一直加和,直到和小于某一处的数值,然后从该处继续加和所以状态转移方程可以写为: add=max(add+nums[i],nums[i]).每次记录都会更新add的最大值,最后返回add的最大值。

  30. 三数值和为0
    https://leetcode-cn.com/problems/3sum/comments/
    这题的思路是两个数字的和确定第三个和,所以只需要略大于O(n^2)的时间就可以遍历完成,但是同样的思路我的程序没有通过测试,也是醉了。

  31. 验证二叉树
    https://leetcode-cn.com/problems/validate-binary-search-tree/submissions/
    这道题有两种解法,第一种方法就是回溯法,但是我不知道为何我的代码没有通关,第二种方法是中序遍历,因为如果按照中序遍历的话,所有的数值呈递增排列。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值