leetcode
user-Mars
一名热爱技术、热爱生活的计算机爱好者。
展开
-
Leetcode--12. 整数转罗马数字[2020. 11. 12]
Leetcode–12. 整数转罗马数字前言 这题的其实还是比较简单的,最直观的方法应该是硬编码法,贪心也是一种非常好的解法。首先是硬编码,我们可以这么去理解,输入的数的每个位上的数字都有对应的罗马字符,其中千百十个位都不相同。我们只要列举出各个位上的所有可能性,然后对应入座即可。贪心算法的本质,是寻找当前最符合的情况,即寻找当前时间下做出最佳可能决策的算法。对于本题,我们只需要找到符合条件的数值,将罗马数值添加到结果,并将num减去它直到num<=0即可。题目罗马数字包含原创 2020-11-12 23:09:27 · 128 阅读 · 0 评论 -
Leetcode--15. 三数之和 [2020.9.10]
Leetcode–15. 三数之和 [2020.9.10]前言 这题其实难度并不是很大,我一开始的思路是正确的,双指针移动。但逻辑顺序没有完全搞清楚就上手编程,导致后面调bug浪费了很多时间。以后做题一定不要急于去做,一定要把整体的思路逻辑整理完毕了再下手,不然有bug修改起来很麻烦,而且思路容易紊乱。 回到该题,首先我们需要将数组元素从小到大升序排序,确定起始指针,然后在起始指针右侧元素确定左右指针。基本思想就是:如果三个元素和相加等于0.则满足要求将其放入结果数组,如果小于0,则将左指针右移;原创 2020-09-12 00:05:18 · 104 阅读 · 0 评论 -
Leetcode--11. 盛最多水的容器 [2020.9.10]
Leetcode–11. 盛最多水的容器 [2020.9.10]前言 这题其实还是比较简单的题目,只要思路正确,很快就能解出来。 首先易知,对于两个长短不同的木板,其所能盛水的最大面积由最短的木板决定,即height[min]∗(m−n)height[min]*(m-n)height[min]∗(m−n)。我们可以从所有木板的最左和最右开始,分别设立左右指针。初始面积为height[min]∗(m−n)height[min]*(m-n)height[min]∗(m−n),随后我们找到最短的木板,原创 2020-09-10 11:39:54 · 85 阅读 · 0 评论 -
Leetcode--10. 正则表达式匹配(动态规划) [2020.9.10]
Leetcode–10. 正则表达式匹配(动态规划) [2020.9.10]前言 这题一开始我是打算把各种情况if-else的角度穷举出来,做到后面缴枪投降,后来参考了别人的解答才发现这是一道动态规划的问题。唉,dp问题就是我的梦魇,经常无法判断这道题是否为dp,感觉还是题目做少了,还得多加练习才是。 回到这道题目,对于动态规划问题,最重要的还是要按照dp流程一步一步走:(定义):s[i]s[i]s[i]和p[j]p[j]p[j]分别为s与p字串第iii和jjj个字母,dp[i][j]dp[i原创 2020-09-10 10:48:50 · 164 阅读 · 0 评论 -
Leetcode--7. 字符串转换整数 (atoi) [2020.9.9]
Leetcode–7. 字符串转换整数 (atoi) [2020.9.9]前言 这题难度不大,主要是细节的处理。主要的思路是总结出几种情况的判定:数字后一位只有为数字才能继续,否则判断是否溢出,输出加号减号后一位只有为数字才能继续,否则输出0遇到空格直接continue;continue;continue;非数字、非加减号,非空,输出0 注意以上四种情况的判定顺序,还有注意数据溢出以及正负的处理。题目代码/*代码可能有点冗余,有能力能够自己简化*/class Solutio原创 2020-09-09 10:03:13 · 87 阅读 · 0 评论 -
Leetcode--6. Z 字形变换 [2020.9.8]
Leetcode–6. Z 字形变换 [2020.9.8]前言 这题我一开始用自己的方法,利用已知行数,将Z分割成多组,每组为2n−22n-22n−2个元素。将s对应元素下标对2n−22n-22n−2取余,然后根据余数就能够判断该数在Z字的哪一行,将其放入相应的字符串中,最后将各个字符串合并就可以获得具体的答案。但是时间与空间的效率并不高,并且由于数字下标从0开始,如果不注意细节很容易出错 题解的思路其实和我的也类似,但是多设置了一个flag=-1,在i=0i=0i=0与i=numRow−1i=n原创 2020-09-08 21:00:15 · 128 阅读 · 0 评论 -
Leetcode--5. 最长回文子串(动态规划) [2020.9.8]
Leetcode–5. 最长回文子串(动态规划) [2020.9.8]前言 本文参考了leetcode题解,liweiwei1419大佬发表的动态规划、中心扩散、Manacher 算法一文,给了我很大的启发。 本题是寻找最长的回文子串,解法有很多,暴力、动态规划、中心扩散法等方法。本文主要是从动态规划的角度去解决最长回文子串的问题。 对于动态规划的思想可以参考一下liweiwei1419大佬的文章:leetcode题解,一下只给出一点自己做题中的思路与感想。 我觉得动态规划问题最重要的是原创 2020-09-08 16:37:10 · 108 阅读 · 0 评论 -
Leetcode--4. 寻找两个正序数组的中位数(二分法) [2020.9.7]
Leetcode–4. 寻找两个正序数组的中位数 [2020.9.7]前言 这题卡了我好一会儿,主要还是细节的处理不够,以及做题的经验还是不足。 首先,看到题目要求的时间复杂度是0(log(m+n)),所以能够排除将两个向量合并成一个向量的想法,需要利用向量的长度,以及元素的具体位置进行操作O(1),然后利用二分的方法去解。一开始我的想法是构造一个大小堆,然后维护大小堆的个数使其保持一直,但是发现插入其时间复杂度为O(nlog),所以这条路不通。 然后就想到了二分的角度去解决问题,但一个难点原创 2020-09-08 00:33:37 · 424 阅读 · 0 评论 -
Leetcode--3. 无重复字符的最长子串(滑动窗口)[2020.9.7]
Leetcode–3. 无重复字符的最长子串(滑动窗口)前言 本题是一道非常典型的无重复最长子串题,其实并不是很难,主要是利用左右指针进行滑动,从而截取到最长的字串。 主要的编程思路是,构建一个哈希表存储当前字串的各个字符。移动一次右指针,查看所指元素是否存在与哈希表中,如果不存在直接加入,判断是否为最长字串;如果存在,则移动左指针,相当于剔除一个元素,然后判断是否还存在,通过不断的剔除必能获得不重复的新的字串,然后加入右指针所指元素。 以此类推我们能够的到最长字串的长度,时间的复杂度是0(n原创 2020-09-07 19:18:37 · 117 阅读 · 1 评论 -
Leetcode--2. 两数相加(链表的操作) [2020.9.7]
Leetcode–2. 两数相加(链表的操作)前言这一题其实并不难,但是我还是疏忽出了点错误。首先,对该题的第一直觉是链表表示转化为int整型,然后求和后再转化为链表。但是缺疏忽了万一链表长度很长,令求和结果位数过多而导致数据溢出。所以这种解法很有局限性。该题应该从链表的角度上去思考,这样就能避免由于位数过多而导致的数据溢出。需要考虑两个链表的长度问题,利用两个链表的指针同时平移,若某一指针下一个为空,则停止其移动,计算另一链表与进位的求和结果。该题还有一个小细节就是进位的处理,我们可以设立一个进原创 2020-09-07 19:17:43 · 82 阅读 · 0 评论 -
Leetcode--107. 二叉树的层次遍历(DFS、BFS) [2020.9.6]
Leetcode–107. 二叉树的层次遍历 II [9/6/2020]前言这是我做leetcode的第一题,其实比较简单,主要也是为了熟悉leetcode这个平台,以及相关的答题规范。本题是hot 100 的第一题,是一个二叉树层次遍历问题,可以运用BFS、DFS手段进行逐行遍历,获取隔行向量,然后自底向上的输出各行向量,需要注意的特殊情况的处理,比如root为空的时候返回null。BFS——广度优先搜索,主要思想就是构建一个队列,将初始节点放入队列之中,然后记录队列内节点数目。然后弹出队列的原创 2020-09-07 19:16:30 · 168 阅读 · 0 评论