![](https://img-blog.csdnimg.cn/20201014180756738.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
LeetCode
mayifan_blog
湖南大学,电气自动化,自学互联网
展开
-
[swift] LeetCode 38. Count and Say | 报数
题目描述分析本题采用两重循环嵌套,第一重决定了需要对字符串进行几次处理,比如输入4,则需要对“1”做三次处理。在对字符串的处理操作中,是先把最后一次的字符串转变为字符数组然后从头开始遍历,如果下一个数和当前数相同,则计数加一,当不同的时候,就把计数结果和字符内容追加到临时字符串末尾,在遍历的时候需要注意下标的范围。每次变化后更新字符串,变化几次之后返回最终的结果。题解class Solu...原创 2019-06-30 13:05:34 · 163 阅读 · 0 评论 -
LeetCode 797. All Paths From Source to Target(所有可能的路径)
题目:分析:这题可以通过递归来解决,到了一个新的节点就通过graph数组查找它可以到达的下一个节点然后递归这些节点,在这个过程中不断把遍历到的节点添加到ArrayList中,找到目标节点后,把ArrayList添加到这个ArrayListAll中,ArrayListAll的需要在方法中传递,而ArrayList在递归调用前需要先copy一份,确保每个递归路径持有引用独立的ArrayList。...原创 2019-02-20 15:27:40 · 256 阅读 · 0 评论 -
738. Monotone Increasing Digits(单调递增的数字)
** 题目**分析:首先分析题目给出的条件,输出的数不能大于输入的数,且输出的数的各个位数单调递增的。解决这类条件限定题目,可以有两种思路:在位数等确定的情况下可以使用for循环以及if else进行筛选和判断。在位数不确定的情况下,一般通过对原数组的遍历修改,达到目标。这两种情况都需要对条件充分认识,后者会更加趋向于对规律的判断。我们选择第二种方法,输入的位数是不确定的,输出的位数...原创 2019-02-14 13:36:22 · 240 阅读 · 0 评论 -
LeetCode 787. Cheapest Flights Within K Stops(K站中转内最便宜的航班)
题目:分析:这题的思路是用递归来求解,因为每一步的判断都是类似的,比如找到下一个可以去的地方,然后把总价加上航班价格再把转站次数减一,递归,把这些修改后的参数作为新的参数。这题也有“剪枝”的思想,当总价大于当前更新的最小总价,那么就结束该方向的递归;或者是当前可转站次数为0,搜寻可直接到达的站点是否有目标站点,如果没有,则结束递归,如果有,就尝试更新最小总价。解题过程:特殊情况处理。i...原创 2019-02-19 17:28:01 · 319 阅读 · 0 评论 -
LeetCode 347. 前K个高频元素 692.前K个高频单词
题目:分析:这题要求从所给数组中筛选出出现频率前k高的元素,因此需要统计每个数出现的次数,使用HashMap记录数据和它们出现的频次,读到的数如果在Map中不存在,则添加到Map中并记录频次为1,一旦第二次读到,就把计数加一。HashMap<Integer, Integer> map=new HashMap<>(); for(int i=0;i&lt...原创 2019-02-19 16:58:13 · 153 阅读 · 0 评论 -
LeetCode 227. Basic Calculator II(基本计算器)
题目:解析:这题的解决思路是模拟运算过程,从左到右,读取数字和字符,做到累加,关键是如何解决遇到的乘号或者除号的问题,因为在遇到他们之前那个数字已经被累加或者减去了,此时需要减掉多加的部分(这个数可能是正值也可能是负值)。需要保存的值有:最后一次读到的符号、最后一个读到的符号的左右两个数、累计总和。最后还需要考虑末尾数字的累加问题。过程分析:刚开始默认sign为“+”,读到数字就把之前的...原创 2019-02-19 02:46:58 · 182 阅读 · 0 评论 -
LeetCode 105. 从前序与中序遍历序列构造二叉树、106. 从中序与后序遍历序列构造二叉树
题目分析:一般我们是通过递归,由已知的二叉树获取遍历的序列,这题的要求和以往相反,需要我们通过前序和中序遍历的序列构造出二叉树。基本思路是递归来实现建树,关键是找到不同当前root节点与下一层节点的关系,如何得到两个子树的前序和中序遍历然后递归这个方法,其中还要实现root节点与其左子节点和右子节点的连接。第一次调用该方法new一个根节点,调用左右子树的该方法分别返回一个左子节点和右子节点的...原创 2019-02-13 15:41:41 · 298 阅读 · 0 评论 -
LeetCode 110.平衡二叉树、865. 具有所有最深结点的最小子树
判断平衡二叉树题目:分析:二叉树的题目一般选择递归求解,通过判断原式的返回值和入口参数,发现这里原式就可以拿来递归。这题的关键是找到当前树和子树的关于平衡二叉树判断的联系。把求当前树平衡转移到对子树的平衡判断中。比如先是判断以根节点为代表的树是否为配合二叉树,递推关系是:它的左子树和右子树都分别需要是平衡二叉树,然后左子树的深度和右子树的深度相差小于2。这样就把判断转移到了子树,最后好需要实...原创 2019-02-13 11:35:33 · 302 阅读 · 0 评论 -
437. Path Sum III(路径总和)
题目:两重递归思路:两个递归,一个是遍历出发点的递归,另一个是递归计算从当前节点出发得到sum的路径数。递归出发点:如果当前节点为null,则返回0.如果当前节点非null节点,则计算当前节点是否为所求解并且以它的左子节点和右子节点为root递归该方法。public int pathSum(TreeNode root, int sum) { if(root==nul...原创 2019-02-23 17:39:06 · 230 阅读 · 0 评论 -
LeetCode 669. Trim a Binary Search Tree(修剪二叉搜索树)
题目:如何去看待修剪这个说法:修剪即去掉那些不在范围内的节点,那么我们是不是可以理解为调整节点之间的引用关系,把这个“修剪”的过程和递归联系起来。**调整引用关系的思路: **递归的节点不满足条件的情况:这是类似于递归查找的部分,如果当前root的值不满足条件,那么就会放弃这个节点的值,若它小于L,就去当前节点的右节点去找,如果它大于R,就去当前节点的左节点去找。当找到一个在范围内的节点...原创 2019-02-23 13:35:32 · 181 阅读 · 0 评论 -
LeetCode 695.岛屿的最大面积、200. 岛屿的个数、130. 被围绕的区域(递归求解)
岛屿的最大面积题目:DFS(深度优先搜索):假设刚开始所有节点都是没有访问过的,从某一节点出发,先标记它为已访问,然后以它为中心向四周去寻找新的没有访问过的节点,以此类推,直到所有点都被访问完。解题思路:采用递归的思想,遍历每一个为1的节点。把当前节点标为0,从它出发访问周围为1的节点,以此类推。递归的方法需要有返回值,每访问一个节点,返回值累加1,最终初始调用处会得到一个“岛屿的面积”,...原创 2019-02-11 22:00:22 · 436 阅读 · 0 评论 -
LeetCode 55. Jump Game(跳跃游戏)
题目:分析:最初我想到的是递归,为什么这题可以用递归呢?因为它的每一步都有相似的地方,比如说它的下一个落子点可以根据当前位置的nums值来得到,递归寻找后续的落子点。当有一个递归方法的传入参数为最后一个位置时,就把标志位设置为true,然后就判断标志位剪枝,没找到就通过递归继续寻找,知道所有的递归方法结束。递归的代码:class Solution { boolean flag=f...原创 2019-02-20 18:42:33 · 184 阅读 · 0 评论 -
LeetCode 204. Count Primes(计数质数)
题目:分析:求解这题如果选择常规的思路去遍历判断每个数是否为质数,即它只能被1和自身整除,时间会超,复杂度O(n^2)。为了优化时间,这题可以使用筛选的方法来实现质数的计算,具体实现是埃拉托斯特尼筛法。埃拉托斯特尼筛法:把大于等于2,小于根号n的那些数的整数倍删除,剩下的就是所要求的范围内的质数。先使用一个boolean的数组来保存每个值是否可取的信息,然后先筛去0和1,把它们赋值为tr...原创 2019-02-21 12:18:24 · 181 阅读 · 0 评论 -
LeetCode 279. Perfect Squares(完全平方数)
题目:分析:拿完全平方数凑一个值,这是不是很类似拿硬币凑一个金额的问题,经典的的动态规划题型。一开始我想尝试用递归搜索去求解,但递归的弊端还是很明显,递归几乎等同于枚举,如果能使用动态规划,那么优先使用动态规划,动态规划的时间复杂度几乎是线性的。题目类型很多,但依然脱离不了几个常见的解题模型,在解题前先想想它是属于哪一类题目的,再用相应的方法求解。如何使用动态规划来解决:动态规划的关键是...原创 2019-02-21 13:18:52 · 233 阅读 · 0 评论 -
[swift] LeetCode 14. Longest Common Prefix | 最长公共前缀
题目描述分析给定数组求解最长公共前缀。我采用的思路是逐个字符串遍历,比对并修正公共前缀。比如先把第一个字符串作为前缀,然后取第二个字符串进行比对,若第二个字符串没有这个前缀,则把前缀尾部去掉一个字符,通过wihle循环再次进行比对,直到成为了第二个字符串的前缀或者长度减为0。另外别忘了对数组长度为0和1的两种情况做特殊返回。题解class Solution { func long...原创 2019-06-30 12:28:04 · 182 阅读 · 0 评论 -
[swift] LeetCode 26. Remove Duplicates from Sorted Array | 删除排序数组中的重复项
题目描述分析**思路:**这题要求我们做两件事,一件事是去除原数组中的重复元素,另一件事是计算修正后的数组长度。我的思路是先创建一个新的不定长度的数组,把原数组的第一个值存入新数组,从原数组第二个元素开始对数组进行遍历,当遇到相同元素时则不予理睬继续进入下一个循环,遇到不同的数则计数加一并且添加进新数组。最终遍历结束后把新数组的沿用赋给nums并返回新数组的长度。swift数组:如下第一...原创 2019-07-04 22:28:22 · 204 阅读 · 0 评论 -
[java] LeetCode 205. Isomorphic Strings | 同构字符串
题目描述分析这题考查的是映射表的建立,映射表一般通过map的数据结构来实现;题目中也提到了一个字符不能被重复映射,这令我想到了set到数据结构。因此这题需要用到HashMap和HashSet。特殊情况处理:长度不等,直接返回false。过程描述:取出对应位置的两个字符串的字符a和b。先判断map中是否存在这个字符,如果存在,则必须满足b等于a在map中的映射值,否则返回false;如果m...原创 2019-07-14 12:21:12 · 225 阅读 · 0 评论 -
[java] LeetCode 415. Add Strings | 字符串相加
题目描述解题分析题目要求不能直接把字符串转为数字,那么只能对其中的字符进行操作了,思路是分别从最低位开始累加,用临时变量保存进位,最后不能忘记对i==0时的特殊处理(若需要变长),字符转int的最简单的方式就是把char值与‘0’作差,这个偏移值就是目标值的大小。总体思路和之前的数组求和大同小异。其中采用StringBuilder来保存结果,最后需要反转。如果在移动过程中num2的下标小于0...原创 2019-07-14 10:11:17 · 224 阅读 · 0 评论 -
[java] LeetCode 989. Add to Array-Form of Integer | 数组形式的整数加法
题目描述思路分析这题最快最好的解法依然是对数组直接进行赋值操作,并在必要的情况下对数组扩容。1、首先需要把K转为数组,这样方便一对一比对: int count = 0; int temp = K; while (temp>0) { temp=temp/10; count...原创 2019-07-14 01:36:58 · 231 阅读 · 0 评论 -
[swift] 234. Palindrome Linked List | 回文链表
题目描述题目分析这题我使用了两种方式来求解。相同点是都先对链表进行遍历,把其中的值取出。不同点是第一种方法采用的是数组来保存数据,然后分别拿首尾的数据进行比对,判断是否回文;而第二种方法是在遍历的过程中生成正反两个字符串,最后判断两个字符串是否相等,如果相等则是回文。解法一class Solution { func isPalindrome(_ head: ListNo...原创 2019-06-29 11:46:09 · 172 阅读 · 0 评论 -
LeetCode 101. Symmetric Tree | 对称二叉树
题目public class TreeNode { public var val: Int public var left: TreeNode? public var right: TreeNode? public init(_ val: Int) { self.val = val self.left = n...原创 2019-06-29 10:09:36 · 158 阅读 · 0 评论 -
[swift] LeetCode 9. Palindrome Number | 回文数
题目描述求解思路这题的思路比较简单,主要是把数字转化为字符串,然后遍历字符串拼接得到新的字符串,即做反转,再比较反转后的字符串和原字符串是否相等,如果相等,则是回文数。代码实现class Solution { func isPalindrome(_ x: Int) -> Bool { let original = String(x) ...原创 2019-06-29 11:08:46 · 165 阅读 · 0 评论 -
[java] LeetCode 66. Plus One | 加一
题目描述分析拿到这题我最初的思路是把数组中的数据取出来得到一个整数,然后对整数加一再还原得到数组,在这种情况下,需要把变量设置为long,可即便如此还是会有高位错误的问题发生(当数组长度长一些的时候),所以这种方法没有最终被采纳。其实最简单的方法是直接对数组参数修正赋值,可是其中也有一个坑,就是可能会发生数组长度改变的情况(当第一个数为9且需要进位),在这种情况下我采取的措施是造一个新的数组...原创 2019-07-13 19:15:10 · 147 阅读 · 0 评论 -
[java] LeetCode 697. Degree of an Array | 数组的度
题目描述解题思路这题需要我们找到满足最大频数的最小子序列,最大频数的出现必然是某个值或频数相等的某几个值,最短的子序列即在原序列中截取得到包含所有该数的子序列,如上例子中就是把最左边的2的左边的数全部去掉,最右边的2的右边的数全部去掉。第一步:找到出现频数最高的数,它可能是一个或者多个。第二步:分别截取包含所有这些数的最短连续数组。第三步:返回以上几种情况中的最短的连续数组长度。代码...原创 2019-07-13 16:38:40 · 209 阅读 · 0 评论 -
LeetCode 447. Number of Boomerangs(回旋镖数量)
题目:思路:先确定一个点,然后找到所有到它的距离相等的点,当距离相等的点的数目为2时,有21种,当数目为3时,有32种,于是,如果有n个点,那么可以得到的回旋镖的数目为n*(n-1)。对每个点的判断方法都是一样的,把以所有点为第一个点所能得到的所有回旋镖数目累加,就是总数了。保存到每个点有相同距离的点的数目的方式:使用HashMap完成计数。for(int j=0;j<point...原创 2019-02-22 14:09:27 · 171 阅读 · 0 评论 -
LeetCode 62.63. Unique Paths(不同路径)
Unique Paths(不同路径)题目解析思路:拿到这个题目有两种思路,递归和动归。下面分析两种方法的选择理由和可行性。递归:递归一般用于处理题目中有重复出现的选择和判断的情况,可以套用相同的方法来解决。递归的优点是可以应对各种输入的变化,实现完全的枚举以及剪枝操作。但是当情况复杂的时候,可能会申请过多的空间造成超时或者空间不足,在空间使用很大的情况下也会影响到时间的。在这题可以用递归...原创 2019-02-10 12:37:07 · 186 阅读 · 0 评论 -
LeetCode 7. Reverse Integer(整数反转)
题目分析最初的想法:一开始打算把原数字分解,分解出它的符号,再分解出它的每一位保存在数组中,然后合成需要的数值。但是这有一个问题,需要考虑溢出,在计算的过程中会出现溢出而和预期的结果不一致的情况。且因为是拆分的合并,在计算的过程中多次加if语句来判断参数范围,算法很低效,也很容易出错。如何优化算法:为了解决计算公式复杂的问题,接下来我试着去掉数组,在一个循环中累加新值,把运算的过程放在一个...原创 2019-02-03 10:58:38 · 134 阅读 · 0 评论 -
LeetCode 173. Binary Search Tree Iterator(二叉搜索树迭代器)
题目代码框架:/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode(int x) { val = x; } * } */class BSTIterat...原创 2019-02-01 20:30:19 · 183 阅读 · 0 评论 -
Leetcode 450. Delete Node in a BST(删除BST中的节点)
题目解法思路:这题的求解依然可以使用到递归的思想,给出一个根节点和key值,删除key值对应的节点,如果当前给出的根节点的val大于key值,那么就可以从把当前根节点的左子节点作为新的根节点,递归调用这个方法;如果根节点的val小于key值,则把当前根节点的右子树当做新的根节点,递归调用这个方法。当然最终可能会找到key值和value值相同的情况,那么这个节点就是需要删除的节点了,然后我采取...原创 2019-02-01 19:15:39 · 237 阅读 · 0 评论 -
LeetCode 236. Lowest Common Ancestor of a Binary Tree(二叉树的最近公共祖先)
题目分析思路:寻找给定节点的公共祖先,一般这类题目可以采用树的遍历的思想来解决,在遍历树的过程中,我们可以找到这两个节点的位置,同时,在遍历的过程中,也可以知道到达节点的路径,当我们得到了路径,就可以找到两条路径的重叠的部分,那么两条路径开始分开的那个节点,就是所求的公共祖先节点,它的深度最大。实现步骤:1、递归:使用递归的思想可以完成二叉树的遍历。这里采用的是中根遍历的思想。为了确定路...原创 2019-02-01 15:39:06 · 174 阅读 · 0 评论 -
LeetCode 6. ZigZag Conversion(Z字形变换)
题目将一个给定字符串根据给定的行数,以从上往下、从左到右进行 Z 字形排列。比如输入字符串为 &amp;amp;quot;LEETCODEISHIRING&amp;amp;quot; 行数为 3 时,排列如下:L C I RE T O E S I I GE D H N之后,你的输出需要从左往右逐行读取,产生出一个新的字符串,比如:&amp;amp原创 2019-02-01 11:10:09 · 309 阅读 · 0 评论 -
LeetCode 336. Palindrome Pairs(回文对)
题目给定一组唯一的单词, 找出所有不同 的索引对(i, j),使得列表中的两个单词, words[i] + words[j] ,可拼接成回文串。示例 1:输入: ["abcd","dcba","lls","s","sssll"]输出: [[0,1],[1,0],[3,2],[2,4]] 解释: 可拼接成的回原创 2019-01-31 21:56:59 · 672 阅读 · 1 评论 -
LeetCode 43. 字符串相乘(Multiply Strings) 大数乘法
题目给定两个以字符串形式表示的非负整数 num1 和 num2,返回 num1 和 num2 的乘积,它们的乘积也表示为字符串形式。示例 1:输入: num1 = “2”, num2 = “3”输出: “6”示例 2:输入: num1 = “123”, num2 = “456”输出: “56088”说明:num1 和 num2 的长度小于110。num1 和 num2 只包含数...原创 2019-01-31 15:49:58 · 486 阅读 · 0 评论 -
LeetCode 5. Longest Palindromic Substring(最长回文子串)
题目描述给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 的最大长度为 1000。示例 1:输入: "babad"输出: "bab"注意: "aba" 也是一个有效答案。示例 2:输入: "cbbd"输出: "bb"解题思路思路:采用的思路是遍历每个点,然后分别以每原创 2019-01-31 15:31:31 · 174 阅读 · 0 评论 -
LeetCode 67.AddBinary(二进制数相加)
题目描述给定两个二进制字符串,返回他们的和(用二进制表示)。输入为非空字符串且只包含数字 1 和 0。示例 1:输入: a = "11", b = "1"输出: "100"示例 2:输入: a = "1010", b = "1011"输出: "10101&quo原创 2019-01-31 15:16:00 · 188 阅读 · 0 评论 -
leetcode 214. Shortest Palindrome(最短回文串)
题目描述给定一个字符串 s,你可以通过在字符串前面添加字符将其转换为回文串。找到并返回可以用这种方式转换的最短回文串。示例 1: 输入: “aacecaaa”输出: “aaacecaaa”示例 2: 输入: “abcd”输出: “dcbabcd”求解什么是回文串?回文串就是指正着看和反过来看都是相同的字符串,即字符串对称。回文分为单回文和双回文,单回文字符串长度是奇数,这个字符串...原创 2019-01-31 14:54:50 · 371 阅读 · 0 评论 -
LeetCode 190.Reverse Bits(颠倒二进制位)
题目求解思路:我采用的IDE是Java,在Java中二进制转为int是对二进制求补码(在Java中都是有符号数),同理int转byte就是补码的逆运算,例如8位的二进制的范围就是-128~127,如果对字节的赋值超过这个范围编译器就会报错。在计算机中一个int值是保存在32个位中的(也就是四个字节),因此例如-3这个数对应的存储单元为11111111111111111111111111111...原创 2019-02-03 11:41:36 · 200 阅读 · 0 评论 -
LeetCode 41. First Missing Positive(缺失的第一个正数)
题目题目补充说明:这题中输入的数据中可以有负值,可以有重复的值,其中真正需要的排序效果是1,2,3,4…n这样的效果,让在这些数据之间找到缺失的第一个正数。解析分析:在明确了题目的实际要求之后,就可以设计算法了,比如如何处理负数和重复的数据,如何满足题目对于时间复杂度和空间复杂度的要求,时间复杂度要求只能遍历一遍,空间复杂的决定了算法中只能使用常数变量而不能使用HashMap。于是我的思路...原创 2019-02-04 14:01:00 · 186 阅读 · 0 评论 -
LeetCode 764. Largest Plus Sign(最大加号标志)
题目在一个大小在 (0, 0) 到 (N-1, N-1) 的2D网格 grid 中,除了在 mines 中给出的单元为 0,其他每个单元都是 1。网格中包含 1 的最大的轴对齐加号标志是多少阶?返回加号标志的阶数。如果未找到加号标志,则返回 0。一个 k" 阶由 1 组成的“轴对称”加号标志具有中心网格 grid[x][y] = 1 ,以及4个从中心向上、向下、向左、向右延伸,长度为 k-1...原创 2019-02-04 15:28:42 · 363 阅读 · 0 评论 -
LeetCode 39.40. Combination Sum(组合总和)
题目解析思路:这是一道在选择数字的题,条件是数字和为目标值。数字可以被重复选择,集合不能包含重复组合。假设我们从其中选取了一个数a,那么下一个数字依然可以从所有的数字中取选择,新的目标值改变为target-a。接下来的每一步都是一样,都可以用相同的公式去迭代,如果在方法进入后发现传入的target值小于0了,那么就“剪枝”。如果target值正好等于0,那么这就是我们要的组合,在递归的过程中...原创 2019-02-10 11:41:52 · 219 阅读 · 0 评论