LeetCode
文章平均质量分 55
OneDeveloper
当你无所事事的时候,就得好好想想还缺少什么!!!
展开
-
647. 回文子串
题目链接:https://leetcode-cn.com/problems/palindromic-substrings/description/基于动态规划 - 1这题基于动态规划的思想来解答的话,实现思想参考自 :http://www.bkjia.com/Cyy/988261.html借助一个辅助二维数组 dp[i][j],其中 i 和 j 一起作用,表示字符串 s 中...原创 2018-04-08 17:15:15 · 2108 阅读 · 0 评论 -
【探索-中级算法】子集
这里题目没有要求子集内的元素必须升序,也没有要求所有子集的排列顺序,且没有重复的元素。参考自:http://www.cnblogs.com/grandyang/p/4309345.html解法一 迭代对于题目中给的例子[1,2,3]来说,最开始是空集,那么我们现在要处理1,就在空集上加1,为[1],现在有两个自己[]和[1],下面来处理2,我们在之前的子集基础上,每个都加个2,可以分别得...转载 2018-11-16 19:34:35 · 263 阅读 · 0 评论 -
【探索-中级算法】颜色分类
初级解法一首先,使用最简单的解法,可以拆分成两步。第一步:扫描数组,先把 0 放在最前面,把 1 和 2 放在最后面(即使是混淆的也没关系)。第二步:再在混淆的 1 和 2 中进行排序。每一步的排序,都需要借助两个指针。public void sortColors(int[] nums) { if (nums == null || nums.length == 0) retur...原创 2018-11-20 20:24:42 · 719 阅读 · 0 评论 -
【探索-中级算法】电话号码的字母组合
回溯法引用自:https://www.cnblogs.com/steven_oyj/archive/2010/05/22/1741376.html概念回溯算法实际上一个类似枚举的搜索尝试过程,主要是在搜索尝试过程中寻找问题的解,当发现已不满足求解条件时,就“回溯”返回,尝试别的路径。回溯法是一种选优搜索法,按选优条件向前搜索,以达到目标。但当探索到某一步时,发现原先选择并不优或达不到目标...原创 2018-11-12 14:30:32 · 333 阅读 · 0 评论 -
【探索-中级算法】每个节点的右向指针
要注意题目给出的条件,其中,使用递归是可以,而使用递归,也是最直观的,且可以假设是一个完美二叉树,因此在处理的时候,可以减少判断逻辑。先上代码:public void connect(TreeLinkNode root) { if (root!=null) { root.next = null; method(root.left, root, null...原创 2018-11-08 15:56:15 · 339 阅读 · 0 评论 -
【探索-中级算法】生成括号
得到全排列的组合,同时对于不符合要求的组合要剔除。public List<String> generateParenthesis(int n) { List<String> result = new ArrayList<>(); recall("", n, n,result); return result;}/原创 2018-11-13 14:09:53 · 129 阅读 · 0 评论 -
【探索-中级算法】中序遍历二叉树
对于二叉树的前、中、后三种遍历顺序,每种遍历算法可以分为递归与迭代来实现。前序遍历:根左右中序遍历:左根右后序遍历:左右根具体实现参考:二叉树遍历(先序、中序、后序)...原创 2018-11-05 12:56:01 · 1836 阅读 · 0 评论 -
【探索-中级算法】岛屿的个数
最开始想到的解决方法,就是借助一个辅助数组 boolean[][] map,其中 map[i][j]==true 表示该土地已经被访问过了,且再借助深度遍历,当遇到一块土地时,同时把与其相连的土地都给遍历掉。public int numIslands(char[][] grid) { if (grid==null||grid.length==0||grid[0].length==0) ...原创 2018-11-10 16:00:16 · 669 阅读 · 0 评论 -
【探索-中级算法】从前序与中序遍历序列构造二叉树
题目中有说 “可以假设树中没有重复的元素”,隐含的意思就是在前序和中序遍历的数组中如果存在某一个元素相等,即可判定为同一节点所对应的。然后就是寻找规律,前序遍为根左右,因此在前序遍历数组 [3, 9, 20, 15 , 7] 中,第一个元素「3」即为最原始的根节点,且对应中序遍历数组 [9, 3, 15, 20, 7] 中的第个元素 inorder[1],而中序遍历为 左根右,因此,在 in...原创 2018-11-07 14:11:32 · 209 阅读 · 0 评论 -
【探索-中级算法】全排列
参考自:https://my.oschina.net/u/3744313/blog/1923933解法一:基于回溯的思想,借助一个辅助数组用于记录访问状态。List<List<Integer>> result = new ArrayList<>();public List<List<Integer>&a原创 2018-11-15 10:22:30 · 142 阅读 · 0 评论 -
【探索-字节跳动】最长公共前缀
解法一先找出最短的那个字符串,然后遍历该字符串的每一个字符,并与剩余字符串的对应位置的字符比较,如果有出现不一致的时候,就表明公共前缀截止了。public String longestCommonPrefix(String[] strs) { if (strs==null||strs.length==0) return ""; if (strs.length==1) retu...原创 2018-11-22 22:08:00 · 387 阅读 · 0 评论 -
【探索-字节跳动】最长连续序列
常规做法,就是先排序,再去处理。public int longestConsecutive(int[] nums) { if (nums == null || nums.length == 0) return 0; Arrays.sort(nums); int max = 1; int tmp = 1; for (int i = 0, len ...原创 2019-01-21 20:06:09 · 1943 阅读 · 0 评论 -
【探索-字节跳动】复原IP地址
可以使用深搜,看每一次的组合是不是符合条件。public List<String> restoreIpAddresses(String s) { int[] segsStart = new int[4]; dfs(s, segsStart, 0); return result;}public void dfs(String s, int[] segsS...原创 2018-12-10 20:51:18 · 857 阅读 · 0 评论 -
【探索-字节跳动】简化路径
以输入的 / 作为分割,来进行判断,因此有如下几种情况:1、多个连续 / 的情况,则忽略后面的2、一个或者多个连续 . 的情况 (1) 只有一个点的话,则表示还是在当前目录 (2) 两个点的话,则要返回到上一级目录 (3) 三个或者以上的点,则不进处理,正常遍历3、以及正常的路径名,而且路径名里面也可以包含 .// 执行用时:10 mspublic String simplif...原创 2018-12-10 19:36:17 · 489 阅读 · 0 评论 -
【探索-字节跳动】最长连续递增序列
题目只要找最长的连续且递增的序列,因此在实现上比较简单,只要一个辅助变量,记录前一个元素 num[i-1] 以其结尾时的连续递增序列的长度即可,然后用当前元素 nums[i] 与止比较即可。public int findLengthOfLCIS(int[] nums) { if (nums==null||nums.length==0) return 0; int max = 1...原创 2018-12-16 17:47:38 · 1236 阅读 · 1 评论 -
【探索-字节跳动】翻转字符串里的单词
实现思想,就是先整个的把字符串倒转过来,如 the sky is blue 直接倒转成 eulb si yks eht,然后,再单独把每个单词还原即可。另外还需要注意说明中的条件。public String reverseWords(String s) { if (s==null||s.length()==0) return &amp;amp;quot;&amp;amp;quot;; char[] chars = s.toCha...原创 2018-11-27 16:20:31 · 352 阅读 · 0 评论 -
【探索-字节跳动】字符串相乘
题目中已经限制了算法的实现途径,即不能用 Java 中现成的 API 去实现,也不能直接转换为整形去相乘。而且这里会涉及到大数,所以我的想法是利用我们手写乘法时的规则饿,将 num1 和 num2 中位数较长的去直接乘以 位数较短的每一位,然后依次把结果加起来即可。// 执行用时:32 mspublic String multiply(String num1, String num2) {...原创 2018-11-26 15:05:42 · 304 阅读 · 0 评论 -
【探索-字节跳动】字符串的排列
这题的核心问题就是 “如何对一个字符串建立一个无关于字符串内字母顺序的唯一映射”。类似于这种问题的,之前有接触过,因为题目给出了字符只包含小写字母,所以我就借助一个辅助数组,对于字符串 s1,遍历其每个字符,并把出现的相同字母的数量映射到该数组中,这样就解决了上述问题。(貌似术语就是使用 字典 的方式)然后利用固定大小的滑窗的思想,针对 s2 中的与 s1 长度相同的子串,也用该方法进行映射...原创 2018-11-24 11:09:30 · 895 阅读 · 0 评论 -
【探索-中级算法】单词搜索
解法一 递归结合回溯与深搜,因同一单元格不能被重复使用,因此借助一个辅助数组用于记录单元格是否被访问过。需要剪枝的策略:1.当前元素与单词的对应位置的字母不一致2.当前元素已经被遍历过3.超出了 borad 的边界public boolean exist(char[][] board, String word) { if (board==null||board[0]==nu...原创 2018-11-17 16:53:46 · 300 阅读 · 0 评论 -
【探索-中级算法】奇偶链表
首先,一定要理解题目。然后就是规定限制条件,要使用原地算法,空间复杂度要为 O(1),时间复杂度应为 O(nodes),nodes 为节点总数。1、基于原地算法,但是时间复杂度为 O(n^2)public ListNode oddEvenList(ListNode head) { if (head==null) return head; ListNode node = h...原创 2018-11-02 14:12:22 · 223 阅读 · 0 评论 -
【探索-中级算法】相交链表
注意题目要求的时间与空间复杂度。只要保持交点之前移动的距离相等即可。即在遍历 A、B 的时候要同时从 a1 和 b2 开始,这样才能保证同时遍历到相交的 c1。public ListNode getIntersectionNode(ListNode headA, ListNode headB) { if (headA == null || headB == null) return ...原创 2018-11-04 12:38:06 · 177 阅读 · 0 评论 -
95. 不同的二叉搜索树 II
参考链接:https://blog.csdn.net/happyaaaaaaaaaaa/article/details/51635367在参考原本的基础上,使用一个辅助数组,保存递归中的值,避免重复计算。//递归实现public List<TreeNode> generateTrees(int n) { if (n < 1) return new A...原创 2018-05-03 11:52:14 · 3073 阅读 · 0 评论 -
96. 不同的二叉搜索树
附二叉搜索树的性质:1、若任意节点的左子树不空,则左子树上所有节点的值均小于它的根节点的值;2、若任意节点的右子树不空,则右子树上所有节点的值均大于它的根节点的值;3、任意节点的左、右子树也分别为二叉查找树;4、没有键值相等的节点。参考链接:https://blog.csdn.net/shinanhualiu/article/details/50225093解题的思路,...原创 2018-04-20 12:53:29 · 790 阅读 · 0 评论 -
486. 预测赢家
原题链接:https://leetcode-cn.com/problems/predict-the-winner/description/该题,在解法上可以使用递归与动归两种思路解决,而这里选择的使用动归来实现。首先要注意到题目中,假设每个玩家的玩法都会使他的分数最大化,并且玩家 1 为先手。public boolean PredictTheWinner(int[] num...原创 2018-04-13 23:04:56 · 2284 阅读 · 0 评论 -
740. 删除与获得点数
参考链接:https://blog.csdn.net/liuchuo/article/details/79573624首先需要注意到 nums[i] 的范围为 [1,10000],然后是题目的条件,如果获得了 nums[i] 元素对应的点数,则要删除 nums[i] 元素,且还需要删除 nums 中所有值为 (nums[i]-1) 或者 (nums[i]+1) 的元素,这里需要注意,n...原创 2018-04-19 11:22:19 · 971 阅读 · 0 评论 -
300. 最长上升子序列
1、常规动归思想首先使用的是常规的动归思想,时间复杂度为 O(n^2),不多解释,只是要注意,dp[i] 每次都是在 dp[0] - dp[i-1] 中寻找最大的值 + 1。public int lengthOfLIS(int[] nums) { if (nums == null || nums.length == 0) return 0; int[] dp = n...转载 2018-04-23 10:52:45 · 807 阅读 · 0 评论 -
343. 整数拆分
1、数学思维参考:http://www.cnblogs.com/shihaochangeworld/p/5547436.htmlpublic static int integerBreak(int n) { if(n <= 3) return n - 1; if (n%2==0) { int numOf3 = n / 6 * 2; ...原创 2018-04-16 13:26:52 · 840 阅读 · 0 评论 -
392. 判断子序列
1、动归首先想到的就是利用动归,先从简单的开始,利用一个二维辅助数组 dp[i][j],表示 s.sub(0,i) 是否为 t.sub(0,j)的子序列,其中有转换方程:if (dp[i][j - 1]) dp[i][j] = true;else dp[i][j] = dp[i - 1][j - 1] && (s.charAt(i) == t.charAt(j))...原创 2018-04-15 16:49:29 · 1338 阅读 · 1 评论 -
712. 两个字符串的最小ASCII删除和
参考链接:http://www.cnblogs.com/A-Little-Nut/p/8439094.html利用动归的思想,使用二维辅助数组 dp[i][j],其含义代表字符串 s1 的子串 s1.sub(0,i-1) 和 s2 的子串 s2.sub(0,j-1) 需删除字符的ASCII值的最小和。 (因为字符串的对于每个字符的位置是从基数 0 开始的)根据上述说明的 dp[i...原创 2018-04-14 22:40:58 · 953 阅读 · 0 评论 -
718. Maximum Length of Repeated Subarray
题目的大概意思,就是求两个数组中相同的最大连续子序列的长度。题目自然是用动归来解决,但是一开始我想错来思路,代码如下:public int findLength2(int[] A, int[] B) { int[][] dp = new int[A.length][B.length]; dp[0][0] = A[0] == B[0] ? 1 : 0; ...原创 2018-04-21 19:51:06 · 154 阅读 · 0 评论 -
【探索-中级算法】字谜分组
解题的关键思想就是将字符串建立起无关于字母顺序,只关于字母个数的唯一映射关系,这样 ,对于同一组符合要求的字符串,则它们的映射都是一样的,以此作为分组的依据。具体的解题方法,暂时想到了两种。1、将字符串映射为字母+数字的组合,如 a1b2c3,这样是符合上述条件的。public static List&amp;lt;List&amp;lt;String&amp;gt;&amp;gt; groupAnagrams(Str...原创 2018-10-25 19:30:11 · 329 阅读 · 0 评论 -
【探索-中级算法】二叉搜索树中第K小的元素
根据二叉搜索树的性质,对其进行中序遍历,会得到一个递增排序的序列,这是一个特性,因此解题的时候可以利用之。解法1public int kthSmallest(TreeNode root, int k) { List&lt;Integer&gt; list = new ArrayList&lt;&gt;(); dfs(root, list, k); return lis...原创 2018-11-09 14:59:33 · 418 阅读 · 0 评论 -
【探索-中级算法】二叉树的锯齿形层次遍历
有两种解决途径,但是规律类似。1.迭代实现public List<List<Integer>> zigzagLevelOrder(TreeNode root) { List<List<Integer>> result = new ArrayList<>(); if (root != null) { ...原创 2018-11-06 15:32:57 · 411 阅读 · 0 评论 -
【探索-中级算法】两数相加
public ListNode addTwoNumbers(ListNode l1, ListNode l2) { if (l1==null) return l2; else if (l2==null) return l1; ListNode head; ListNode node = new ListNode(0); ...原创 2018-11-01 16:30:45 · 186 阅读 · 0 评论 -
【探索-中级算法】矩阵置零
参考链接:https://www.jianshu.com/p/d0017b1e38c4O(mn) 的额外空间public void setZeroes1(int[][] matrix) { if (matrix == null || matrix[0] == null || matrix[0].length &amp;amp;lt; 1) return; // 结合额外的辅助数组来判断 ...原创 2018-10-24 20:33:28 · 224 阅读 · 0 评论 -
【探索-中级算法】递增的三元子序列
最先想到的思路,就是用一个 Map&amp;lt;Integer, List&amp;lt;Integer&amp;gt;&amp;gt;,其中 key 对应下标 index,value 为当 index_x &amp;gt; index 时,如果 nums[index_x] &amp;gt; nums[index],则将该 index_x 添加到 index 对应到链表中,该链表的作用就是收集在 index原创 2018-10-31 19:50:34 · 291 阅读 · 0 评论 -
【探索-中级算法】最长回文子串
这一题可以参考:647. 回文子串本质上是一样的,要判断出所有的回文字串,然后找到其中最长的那一个。中心扩展法中心扩展就是把给定的字符串的每一个字母当做中心,向两边扩展,这样来找最长的子回文串。算法复杂度为O(N^2)public String longestPalindrome(String s) { if (s == null || s.length() &lt; 1) r...原创 2018-10-31 16:46:08 · 125 阅读 · 0 评论 -
【探索-中级算法】无重复字符的最长子串
1.参考自:https://juejin.im/post/5aa159f86fb9a028bb189420思路:初始化一个 255 的 boolean 数组(字符对应的数字作为数组下标)作为所有可能出现的字符对应的存在可能性,不存在重复的均为 false,存在重复的,则对应的下标置为 true。两个指针进行移动,前指针先不动,后指针移动并根据当前字符对应整数下标是否为 false 或者...原创 2018-10-29 21:53:10 · 165 阅读 · 0 评论 -
【探索-中级算法】三数之和
参考链接:LeetCode总结-K-Sum问题本文介绍的解题思想的核心就是排序,排序有两个目的,第一个是次要的,即方便排除重复的组合。第二个就是使得可以按照递增或者递减方便的移动指针 l、r。在排序之后,就可以对数组进行遍历,目标就是找到符合 nums[l] + nums[r] == -target 的组合,而 target 是固定不变的,只要动态的寻找符合条件的 nums[l] 、num...原创 2018-10-23 16:15:30 · 337 阅读 · 2 评论 -
【探索-字节跳动】朋友圈
dfs参考文章:Leetcode学习笔记-547-朋友圈使用深度优先遍历(dfs),如果学生 A 与 B 是好友,则 A 肯定也与 B 的好友圈的任意学生也是好友关系,即有传递性,因此,在遍历到 A 与 B 是好友的时候,还要遍历 B 的好友,与 B 的好友的好友,即会最终把这个圈子的人都遍历到。public int findCircleNum(int[][] M) { if (M...原创 2019-01-23 23:11:22 · 1106 阅读 · 0 评论