大白话LeetCode系列算法题
用通俗简洁、高效的方式解leetcode的题目,并且增加相似的代码注释和逻辑处理注释,方便大家学习和交流,欢迎大家批评指正。
拉丁解牛说技术
大道至简、行胜于言。坚持实用至上,擅长结合大厂生产实践案例,持续专注分享互联网金融技术架构实战经验。
展开
-
合并两个有序数组 Merge Sorted Array 双指针算法详解
给定两个有序整数数组 nums1 和 nums2,将 nums2 合并到 nums1 中,使得 num1 成为一个有序数组。说明:初始化 nums1 和 nums2 的元素数量分别为 m 和 n。 你可以假设 nums1 有足够的空间(空间大小大于或等于 m + n)来保存 nums2 中的元素。示例:输入:nums1 = [1,2,3,0,0,0], m = 3nums2 ...原创 2018-09-23 00:18:25 · 722 阅读 · 1 评论 -
括号生成
给出 n 代表生成括号的对数,请你写出一个函数,使其能够生成所有可能的并且有效的括号组合。例如,给出 n = 3,生成结果为:[ "((()))", "(()())", "(())()", "()(())", "()()()"]使用深度优先搜索算法(DFS),递归操作。对于结果,我们只需要关心左右括号数量一致等于n,而且我们需要保证左右括号数量相等,也就是当左...原创 2018-09-21 16:55:48 · 602 阅读 · 0 评论 -
有效的括号字符串-leetcode 白话高效的解题思路附详细代码注释
给定一个只包含三种字符的字符串:( ,) 和 *,写一个函数来检验这个字符串是否为有效字符串。有效字符串具有如下规则:1、任何左括号 ( 必须有相应的右括号 )。2、任何右括号 ) 必须有相应的左括号 ( 。3、左括号 ( 必须在对应的右括号之前 )。4、* 可以被视为单个右括号 ) ,或单个左括号 ( ,或一个空字符串。5、一个空字符串也被视为有效字符串。示例 1:输入: "...原创 2018-09-21 21:42:45 · 1171 阅读 · 0 评论 -
新建有序二叉树BST、求树的最大深度或高度
新建有序二叉树,left node 小于等于root,right node 大于等于root。并求二叉树的树高。package dayscode;import java.util.Scanner;/** * 插入new node到有序二叉树,获取二叉树最大树高 */public class BSTHeight { static class Node { ...原创 2018-08-22 11:16:18 · 1819 阅读 · 0 评论 -
有序二叉树层次遍历
遍历有序二叉树,顺序输出每一层node 的data。 比如二叉树 6 3 91 5 7 10打印输出就是,6,3,9,1,5,7,10。这个利用队列实现非常高效。package dayscode;import java.util.LinkedList;import j...原创 2018-08-22 11:59:44 · 273 阅读 · 0 评论 -
判断一个整数是否为素数算法
素数:n%i==0,那就可以判断n是非素数。算法的复杂度,依赖i的取值范围,如果是2~n那就是O(N)。如果是2~sqrt(N),复杂度就是O(sqrt(N))。 package dayscode;import java.util.Scanner;/** * 判断是否为素数,也就是一个整数只能被1和自己整除。1不是素数 */public class Prime { ...原创 2018-08-22 17:45:16 · 4213 阅读 · 0 评论 -
两数相加-一看就懂,非常详细code解法解释
给定两个非空链表来表示两个非负整数。位数按照逆序方式存储,它们的每个节点只存储单个数字。将两数相加返回一个新的链表。你可以假设除了数字 0 之外,这两个数字都不会以零开头。示例:输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)输出:7 -> 0 -> 8原因:342 + 465 = 807解法: ...原创 2018-08-27 11:41:34 · 486 阅读 · 0 评论 -
白话经典算法快速排序-快速搞定
快速排序算法和归并排序,都是由于时间复杂度只有O(N*logN),得到大量使用。快速排序的核心思想就是分而治之,我每次处理只负责将一个元素的位置排序正确,其他就先不管。那分而治之,递归处理后,所有元素都回到有序的正确位置,排序就完成了。 算法的时间复杂度,N就是因为,需要给每个元素都进行一次调整排序。而logN的时间复杂度,就是给元素调整排序,需要进行拆半数据递归。算...翻译 2018-09-05 11:52:23 · 335 阅读 · 0 评论 -
LeetCode 最长重复子数组 Maximum Length of Repeated Subarray
给两个整数数组 A 和 B ,返回两个数组中公共的、长度最长的子数组的长度。示例 1:输入:A: [1,2,3,2,1]B: [3,2,1,4,7]输出: 3解释: 长度最长的公共子数组是 [3, 2, 1]。说明:1 <= len(A), len(B) <= 1000 0 <= A[i], B[i] < 10解法,这是一道经典的动态规划算...原创 2018-09-13 22:46:55 · 432 阅读 · 0 评论 -
最长重复子串 Max Repeat Sub String 阿里面试题详解
* 最长重复子串* 例子:给定一个字符串* "we are the same human. human."* 输出:* " human.",注:空格也要算。public class MaxRepeatSubString { //解题思路,竟然是重复的子串,那么从某个地方,比如i开始的N个字符,都等于从j开始的N个字符。而且i<=j-N,i和j都大于N,N是重复字符串长...原创 2018-09-14 10:37:44 · 265 阅读 · 0 评论 -
翻转字符串里的单词 Reverse Words in a String 简单的题简单的做
给定一个字符串,逐个翻转字符串中的每个单词。示例: 输入: "the sky is blue",输出: "blue is sky the".说明:无空格字符构成一个单词。 输入字符串可以在前面或者后面包含多余的空格,但是反转后的字符不能包括。 如果两个单词间有多余的空格,将反转后单词间的空格减少到只含一个。public class ReverseWords { ...原创 2018-09-19 21:17:33 · 230 阅读 · 0 评论 -
判断子序列is-subsequence 两种解法
* 判断子序列* 给定字符串 s 和 t ,判断 s 是否为 t 的子序列。* 你可以认为 s 和 t 中仅包含英文小写字母。字符串 t 可能会很长(长度 ~= 500,000),而 s 是个短字符串(长度 <=100)。* 字符串的一个子序列是原始字符串删除一些(也可以不删除)字符而不改变剩余字符相对位置形成的新字符串。(例如,"ace"是"abcde"的一个子序列,而"aec"不...原创 2018-09-11 22:29:19 · 1811 阅读 · 0 评论 -
排列硬币 arrange coins 三种解法详解
* 排列硬币* https://leetcode-cn.com/problems/arranging-coins/description/* 你总共有 n 枚硬币,你需要将它们摆成一个阶梯形状,第 k 行就必须正好有 k 枚硬币。* 给定一个数字 n,找出可形成完整阶梯行的总行数。* n 是一个非负整数,并且在32位有符号整型的范围内。* 示例 1:* n = 5* 硬币可排列成...原创 2018-09-12 12:30:53 · 1301 阅读 · 2 评论 -
leetcode 两数之和
给定一个整数数组和一个目标值,找出数组中和为目标值的两个数。你可以假设每个输入只对应一种答案,且同样的元素不能被重复利用。示例:给定 nums = [2, 7, 11, 15], target = 9因为 nums[0] + nums[1] = 2 + 7 = 9所以返回 [0, 1]解法: 该实现时间复杂度是O(N),空间复杂度为O(N). *依赖hashM...原创 2018-08-27 13:33:53 · 353 阅读 · 0 评论 -
无重复字符的最长子串-LeetCode算法详解
给定一个字符串,找出不含有重复字符的最长子串的长度。示例 1:输入: "abcabcbb"输出: 3 解释: 无重复字符的最长子串是 "abc",其长度为 3核心解法: 定义一个滑动窗口,窗口内无重复元素(所以需要定义个set集合);窗口的滑动有左右边界(所以定义索引left、right)。窗口的首发移动是右边界,当窗口遇到有重复元素,左边界++,且需要移除set该...原创 2018-08-27 15:05:06 · 496 阅读 · 0 评论 -
求最长回文字串,并打印-leetcode题详解过程
同样采用中心扩展法,思路如下图:首先,填充字符串变成数组,然后以某个基准元素,求得它的最大回文子串,记录基准元素的索引pointI,以及回文长度maxLength也就是填充后的字符数组,求得最大回文子串的step步长。通过pointI和maxLength就可以在填充后的字符数组里找到这个字串了。 /** * 返回一个字符串最长回文字串部分 * @param s...原创 2018-08-27 16:23:18 · 321 阅读 · 0 评论 -
最大子序和-leetcode O(N)复杂度里最简单高效的解法
给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。欢迎关注一起交流学习,个人 github: https://github.com/luoqifei 示例:输入: [-2,1,-3,4,-1,2,1,-5,4],输出: 6解释: 连续子数组 [4,-1,2,1] 的和最大,为 6。解答: 1、子序和最大,也就...原创 2018-08-28 11:17:56 · 356 阅读 · 0 评论 -
三数之和-leetcode 简单高效O(N`2)复杂度【两种】解法
让算法变得人人能看懂。最近写了系列leetcode和hackerrank的算法解答。/** * 给定一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?找出所有满足条件且不重复的三元组。 * 注意:答案中不可以包含重复的三元组。 * 例如, 给定数组 nums = [-1, 0, 1, 2, -1, -4], * ...原创 2018-08-28 16:43:00 · 1114 阅读 · 0 评论 -
最接近的三数之和-附详细算法解析
这个题和求三数之和类似,可以参考本博客该题【双】解法 三数之和-leetcode两种高效解法 给定一个包括 n 个整数的数组 nums 和 一个目标值 target。找出 nums 中的三个整数,使得它们的和与 target 最接近。返回这三个数的和。假定每组输入只存在唯一答案。例如,给定数组 nums = [-1,2,1,-4], 和 target = 1....原创 2018-08-28 18:20:54 · 374 阅读 · 0 评论 -
搜索插入位置-leetcode简单高效的二分查找算法
给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。你可以假设数组中无重复元素。示例 1:输入: [1,3,5,6], 5输出: 2示例 2:输入: [1,3,5,6], 2输出: 1 以下code使用两种方式实现,时间复杂度为O(n) 和O(logn)。代码有详细注释,很好...原创 2018-08-29 11:36:23 · 1520 阅读 · 1 评论 -
并两个有序链表-链表合并常用解法
将两个有序链表合并为一个新的有序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 示例:输入:1->2->4, 1->3->4输出:1->1->2->3->4->4/** * 合并两个有序链表 * 将两个有序链表合并为一个新的有序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 * 示例: * ...原创 2018-08-29 13:59:57 · 549 阅读 · 1 评论 -
leetcode合并区间- 附有算法详细解析注释
给出一个区间的集合,请合并所有重叠的区间。示例 1:输入: [[1,3],[2,6],[8,10],[15,18]]输出: [[1,6],[8,10],[15,18]]解释: 区间 [1,3] 和 [2,6] 重叠, 将它们合并为 [1,6].示例 2:输入: [[1,4],[4,5]]输出: [[1,5]]解释: 区间 [1,4] 和 [4,5] 可被视为重叠区间。...原创 2018-08-29 18:16:32 · 1413 阅读 · 0 评论 -
有效括号-面试算法leetcode-java
给定一个只包括 '(',')','{','}','[',']' 的字符串,判断字符串是否有效。有效字符串需满足:1、左括号必须用相同类型的右括号闭合。2、左括号必须以正确的顺序闭合。3、注意空字符串可被认为是有效字符串。示例 1:输入: "()[]{}"输出: true示例 2:输入: "(]"输出: false示例 3:输入: "{[]}"输出: true这...原创 2018-08-30 10:45:32 · 436 阅读 · 0 评论 -
移除数组重复元素-leetcode非常简单的一个双指针移除算法
给定一个数组 nums 和一个值 val,你需要原地移除所有数值等于 val 的元素,返回移除后数组的新长度。不要使用额外的数组空间,你必须在原地修改输入数组并在使用 O(1) 额外空间的条件下完成。元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。示例 1: 给定 nums = [3,2,2,3], val = 3, 函数应该返回新的长度 2,...原创 2018-08-31 10:46:55 · 764 阅读 · 0 评论 -
删除排序数组中的重复项-java 面试 双指针法高效实现
给定一个排序数组,你需要在原地删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度。不要使用额外的数组空间,你必须在原地修改输入数组并在使用 O(1) 额外空间的条件下完成。示例 1:给定数组 nums = [1,1,2], 函数应该返回新的长度 2, 并且原数组 nums 的前两个元素被修改为[1,2]public class RemoveDu...原创 2018-08-31 14:01:24 · 438 阅读 · 0 评论 -
组合总和-java解题思路报告
给定一个无重复元素的数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。 candidates 中的数字可以无限制重复被选取。说明:所有数字(包括 target)都是正整数。解集不能包含重复的组合。示例 1:输入: candidates = [2,3,6,7], target = 7,所求解...原创 2018-08-31 15:51:44 · 848 阅读 · 0 评论 -
组合总和 Combination Sum II-算法详解含代码注释
给定一个数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。candidates 中的每个数字在每个组合中只能使用一次。说明:所有数字(包括目标数)都是正整数。解集不能包含重复的组合。 示例 1:输入: candidates = [10,1,2,7,6,1,5], target = 8,所求解集...原创 2018-08-31 17:59:07 · 1211 阅读 · 1 评论 -
报数-清晰明了的思路解答,高效算法、耗时0毫秒
报数序列是指一个整数序列,按照其中的整数的顺序进行报数,得到下一个数。其前五项如下:1. 12. 113. 214. 12115. 1112211 被读作 "one 1" ("一个一") , 即 11。11 被读作 "two 1s" ("两个一"), 即 21。21 被读作 "one 2", "one 1" (&quo原创 2018-09-01 11:21:43 · 840 阅读 · 0 评论 -
两两交换链表中的节点-java简洁高效的解法详细思路
给定一个链表,两两交换其中相邻的节点,并返回交换后的链表。示例:给定 1->2->3->4, 你应该返回 2->1->4->3说明:你的算法只能使用常数的额外空间。 你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。思路解法: 首先,我们必须明确知道,在链表里,如何正确的进行链表节点交换。比如有个链表,1-...原创 2018-09-02 11:11:36 · 2619 阅读 · 0 评论 -
最长公共前缀-充分利用indexof、substring解决该算法题
编写一个函数来查找字符串数组中的最长公共前缀。如果不存在公共前缀,返回空字符串 ""。示例 1:输入: ["flower","flow","flight"]输出: "fl"示例 2:输入: ["dog","racecar","car"]输出: ""解释: 输入不存在公共前缀。说明:原创 2018-09-02 12:05:21 · 1388 阅读 · 1 评论 -
盛最多水的容器Container With Most Water求max的最佳算法,举一反三
原题: 给定 n 个非负整数 a1,a2,...,an,每个数代表坐标中的一个点 (i, ai) 。在坐标内画 n 条垂直线,垂直线 i 的两个端点分别为 (i, ai) 和 (i, 0)。找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。说明:你不能倾斜容器,且 n 的值至少为 2。图中垂直线代表输入数组 [1,8,6,2,5,4,8,3,7]。在此...原创 2018-09-03 11:01:28 · 1581 阅读 · 0 评论 -
实现strStr() Implement strStr() 实现java的indexof方法
实现 strStr() 函数。给定一个 haystack 字符串和一个 needle 字符串,在 haystack 字符串中找出 needle 字符串出现的第一个位置 (从0开始)。如果不存在,则返回 -1。示例 1:输入: haystack = "hello", needle = "ll"输出: 2示例 2:输入: haystack = "aaaaa", needl...原创 2018-09-04 12:08:16 · 332 阅读 · 0 评论 -
两个数组的交集-Intersection of Two Arrays执行高效算法
给定两个数组,编写一个函数来计算它们的交集。示例 1:输入: nums1 = [1,2,2,1], nums2 = [2,2]输出: [2]示例 2:输入: nums1 = [4,9,5], nums2 = [9,4,9,8,4]输出: [9,4]说明:输出结果中的每个元素一定是唯一的。 我们可以不考虑输出结果的顺序。题目很简单,我们可以利用hashset的特...原创 2018-09-04 17:09:04 · 1355 阅读 · 0 评论 -
两个数组的交集 II Intersection of Two Arrays II-巧妙使用list结构
给定两个数组,编写一个函数来计算它们的交集。示例 1:输入: nums1 = [1,2,2,1], nums2 = [2,2]输出: [2,2]示例 2:输入: nums1 = [4,9,5], nums2 = [9,4,9,8,4]输出: [4,9]说明:输出结果中每个元素出现的次数,应与元素在两个数组中出现的次数一致。 我们可以不考虑输出结果的顺序。进阶:...原创 2018-09-04 18:13:44 · 280 阅读 · 0 评论 -
排序链表Sort List-经典快速排序实现链表排序
在 O(n log n) 时间复杂度和常数级空间复杂度下,对链表进行排序。示例 1:输入: 4->2->1->3输出: 1->2->3->4示例 2:输入: -1->5->3->4->0输出: -1->0->3->4->5 基于快速排序思想去实现,而且链表的排序,在code里,我原创 2018-09-05 14:16:08 · 1438 阅读 · 0 评论 -
复原IP地址 Restore IP Addresses 详细实现思路和注释
每日一道算法数据结构题-打卡2018-09-06复原IP地址 Restore IP Addresses给定一个只包含数字的字符串,复原它并返回所有可能的 IP 地址格式。示例:输入: "25525511135"输出: ["255.255.11.135", "255.255.111.35"] 这是一道需要递归暴力搜索所有可能的题目。解题思路,ip地址有四段、每段的大小不...原创 2018-09-06 18:42:56 · 1034 阅读 · 0 评论 -
最后一个单词的长度-详解倒序遍历突显高级
给定一个仅包含大小写字母和空格 ' ' 的字符串,返回其最后一个单词的长度。如果不存在最后一个单词,请返回 0 。说明:一个单词是指由字母组成,但不包含任何空格的字符串。示例:输入: "Hello World"输出: 5//传统方法比较笨,就是split 然后统计最后一个串的长度 //所以,我们使用倒序遍历 public static int length...原创 2018-09-07 15:29:36 · 184 阅读 · 0 评论 -
二进制求和 add binary 详解高效解法
给定两个二进制字符串,返回他们的和(用二进制表示)。输入为非空字符串且只包含数字 1 和 0。示例 1:输入: a = "11", b = "1"输出: "100"示例 2:输入: a = "1010", b = "1011"输出: "10101"解法,利用倒序遍历求和,记住进位,如果发现遍历的某个串在该位没有值,那设置为0,不影响结果。最后不要忘记进位为1原创 2018-09-08 12:23:24 · 967 阅读 · 0 评论 -
验证回文串 valid palindrome 首尾双指针高效遍历
给定一个字符串,验证它是否是回文串,只考虑字母和数字字符,可以忽略字母的大小写。说明:本题中,我们将空字符串定义为有效的回文串。示例 1:输入: "A man, a plan, a canal: Panama"输出: true示例 2:输入: "race a car"输出: false解法思路: 首先理解,回文字符串,意思就是正着读和反着读,这个字...原创 2018-09-09 22:47:15 · 250 阅读 · 0 评论 -
字符串中的单词数Number of Segments in a String 简单但认真详细的解决
* 统计字符串中的单词个数,这里的单词指的是连续的不是空格的字符。* 请注意,你可以假定字符串里不包括任何不可打印的字符。* 示例:* 输入: "Hello, my name is John"* 输出: 5 看清题目:不是空格,也就是在java里面,就是split方法得出的数组的长度。然后定义一个统计单词的开关isChar,然后将结果加入count中。public cla...原创 2018-09-10 15:36:17 · 369 阅读 · 0 评论