
算法
CodersCoder
有人见星辰,有人见尘埃。
展开
-
算法--翻转二叉树
描述翻转一棵二叉树。示例分析反转二叉树,可以先交换根节点的两个子节点,然后通过同样的方式在交换根节点的子节点的两个子节点。1.从root开始遍历二叉树;2.只要当前节不为空,交换两个子节点;3.对子节点重复上述步骤实现/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; *原创 2020-09-16 18:28:00 · 303 阅读 · 0 评论 -
算法--寻找两个正序数组的中位数
描述给定两个大小为 m 和 n 的正序(从小到大)数组 nums1 和 nums2。请你找出这两个正序数组的中位数,并且要求算法的时间复杂度为 O(log(m + n))。你可以假设 nums1 和 nums2 不会同时为空。示例示例 1:nums1 = [1, 3]nums2 = [2]则中位数是 2.0示例 2:nums1 = [1, 2]nums2 = [3, 4]则中位数是 (2 + 3)/2 = 2.5分析及代码参考:https://leetcode-cn.com/p原创 2020-09-14 18:22:03 · 258 阅读 · 0 评论 -
算法--只出现一次的数字
描述给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。说明:你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗?示例示例 1:输入: [2,2,1]输出: 1示例 2:输入: [4,1,2,1,2]输出: 4分析使用map,进行两次for循环,即可实现class Solution { public int singleNumber(int[] nums) { Map<Integer, I原创 2020-09-12 18:26:43 · 102 阅读 · 0 评论 -
算法--环形链表
描述给定一个链表,判断链表中是否有环。为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。 如果 pos 是 -1,则在该链表中没有环。示例示例 1:输入:head = [3,2,0,-4], pos = 1输出:true解释:链表中有一个环,其尾部连接到第二个节点。示例 2:输入:head = [1,2], pos = 0输出:true解释:链表中有一个环,其尾部连接到第一个节点。示例 3:输入:head = [1], pos =原创 2020-09-11 18:34:03 · 142 阅读 · 0 评论 -
算法--验证回文串
描述给定一个字符串,验证它是否是回文串,只考虑字母和数字字符,可以忽略字母的大小写。说明:本题中,我们将空字符串定义为有效的回文串。示例示例 1:输入: “A man, a plan, a canal: Panama”输出: true示例 2:输入: “race a car”输出: false分析使用双指针。初始时,左右指针分别指向字符串的两侧,随后我们不断地将这两个指针相向移动,每次移动一步,并判断这两个指针指向的字符是否相同。当这两个指针相遇时,就说明是回文串。实现class原创 2020-09-10 19:04:07 · 175 阅读 · 0 评论 -
算法--路径总和
描述给定一个二叉树和一个目标和,判断该树中是否存在根节点到叶子节点的路径,这条路径上所有节点值相加等于目标和。说明: 叶子节点是指没有子节点的节点。示例分析从根节点开始,使用递归,判断左节点或者右节点到叶子节点是否存在sum-root.val即可。实现class Solution { public boolean hasPathSum(TreeNode root, int sum) { if (root == null) { return fa原创 2020-09-08 18:46:12 · 747 阅读 · 0 评论 -
算法--将有序数组转换为二叉搜索树
描述将一个按照升序排列的有序数组,转换为一棵高度平衡二叉搜索树。本题中,一个高度平衡二叉树是指一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1。示例:给定有序数组: [-10,-3,0,5,9],一个可能的答案是:[0,-3,9,-10,null,5],它可以表示下面这个高度平衡二叉搜索树:分析参考https://leetcode-cn.com/problems/convert-sorted-array-to-binary-search-tree/solution/jian-da原创 2020-09-06 23:00:56 · 128 阅读 · 0 评论 -
算法--二叉树的最大深度
描述给定一个二叉树,找出其最大深度。二叉树的深度为根节点到最远叶子节点的最长路径上的节点数。说明: 叶子节点是指没有子节点的节点。示例分析采用递归法:递归问题,主要是拆分子问题和明确递归出口。1.第一步,初始化工作。2.第二步,计算根结点到左右子树高度。3.第三步,递归计算左右子树最大高度。4.最后,返回二叉树的最大深度。实现/** * Definition for a binary tree node. * public class TreeNode { * int原创 2020-09-05 16:55:48 · 206 阅读 · 0 评论 -
算法--对称二叉树
描述给定一个二叉树,检查它是否是镜像对称的。示例分析参考官方解法,使用两种方式完成:1.递归如果一个树的左子树与右子树镜像对称,那么这个树是对称的。如果同时满足下面的条件,两个树互为镜像:它们的两个根结点具有相同的值每个树的右子树都与另一个树的左子树镜像对称我们可以实现这样一个递归函数,通过「同步移动」两个指针的方法来遍历这棵树,pp 指针和 qq 指针一开始都指向这棵树的根,随后 pp 右移时,qq 左移,pp 左移时,qq 右移。每次检查当前 pp 和 qq 节点的值是否原创 2020-09-04 18:15:05 · 162 阅读 · 0 评论 -
算法--相同的树
描述给定两个二叉树,编写一个函数来检验它们是否相同。如果两个树在结构上相同,并且节点具有相同的值,则认为它们是相同的。示例分析使用深度优先遍历分析终止条件与返回值:1.当两棵树的当前节点都为 null 时返回 true2.当其中一个为 null 另一个不为 null 时返回 false3.当两个都不为空但是值不相等时,返回 false实现/** * Definition for a binary tree node. * public class TreeNode { *原创 2020-09-03 18:45:36 · 134 阅读 · 0 评论 -
算法--爬楼梯
描述假设你正在爬楼梯。需要 n 阶你才能到达楼顶。每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?注意:给定 n 是一个正整数。示例示例 1:输入: 2输出: 2解释: 有两种方法可以爬到楼顶。1 阶 + 1 阶2 阶 示例 2:输入: 3输出: 3解释: 有三种方法可以爬到楼顶。1 阶 + 1 阶 + 1 阶1 阶 + 2 阶2 阶 + 1 阶分析本问题其实常规解法可以分成多个子问题,爬第n阶楼梯的方法数量,等于 2 部分之和。爬上原创 2020-09-02 18:54:34 · 406 阅读 · 0 评论 -
算法-- x 的平方根
描述实现 int sqrt(int x) 函数。计算并返回 x 的平方根,其中 x 是非负整数。由于返回类型是整数,结果只保留整数的部分,小数部分将被舍去。示例示例 1:输入: 4输出: 2示例 2:输入: 8输出: 2说明: 8 的平方根是 2.82842…,由于返回类型是整数,小数部分将被舍去。分析参考牛顿迭代法实现class Solution { int s; public int mySqrt(int x) { s=x;原创 2020-08-31 18:57:09 · 375 阅读 · 0 评论 -
算法--二进制求和
描述给你两个二进制字符串,返回它们的和(用二进制表示)。输入为 非空 字符串且只包含数字 1 和 0。示例示例 1:输入: a = “11”, b = “1”输出: “100”示例 2:输入: a = “1010”, b = “1011”输出: “10101”提示:每个字符串仅由字符 ‘0’ 或 ‘1’ 组成。1 <= a.length, b.length <= 10^4字符串如果不是 “0” ,就都不含前导零。分析最简单的做法:先将 aa 和 bb 转化成十进原创 2020-08-30 16:02:24 · 422 阅读 · 0 评论 -
算法--加一
描述给定一个由整数组成的非空数组所表示的非负整数,在该数的基础上加一。最高位数字存放在数组的首位, 数组中每个元素只存储单个数字。你可以假设除了整数 0 之外,这个整数不会以零开头。示例示例 1:输入: [1,2,3]输出: [1,2,4]解释: 输入数组表示数字 123。示例 2:输入: [4,3,2,1]输出: [4,3,2,2]解释: 输入数组表示数字 4321。分析1.0为特殊值,单独操作,遇 0赋 12.在末位不为 9时,给末位数值 + 1即可。3.末位为 9时原创 2020-08-29 22:06:01 · 218 阅读 · 0 评论 -
算法--电话号码的字母组合
描述给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。示例输入:“23”输出:[“ad”, “ae”, “af”, “bd”, “be”, “bf”, “cd”, “ce”, “cf”].分析以示例入手分析:实现private String letterMap[] = { " ", //0 "", //1 "ab原创 2020-08-28 18:57:38 · 214 阅读 · 0 评论 -
算法--最后一个单词的长度
描述给定一个仅包含大小写字母和空格 ’ ’ 的字符串 s,返回其最后一个单词的长度。如果字符串从左向右滚动显示,那么最后一个单词就是最后出现的单词。如果不存在最后一个单词,请返回 0 。说明:一个单词是指仅由字母组成、不包含任何空格字符的 最大子字符串。示例示例:输入: “Hello World”输出: 5分析就是简单的字符串遍历步骤:1.使用trim()去掉字符串左右两边的空格2.将字符串从右往左遍历,遇到第一个空格,就能定位到最后一个单词。实现public int len原创 2020-08-26 18:42:26 · 147 阅读 · 0 评论 -
算法--整数反转
描述给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转。示例示例 1:输入: 123输出: 321示例 2:输入: -123输出: -321示例 3:输入: 120输出: 21注意:假设我们的环境只能存储得下 32 位的有符号整数,则其数值范围为 [−231, 231 − 1]。请根据这个假设,如果反转后整数溢出那么就返回 0。分析用图来表示:按照思路进行编码即可。实现public int reverse(int x) { in原创 2020-08-24 21:35:07 · 259 阅读 · 0 评论 -
算法--合并两个有序链表
描述将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。示例输入:1->2->4, 1->3->4输出:1->1->2->3->4->4分析这道题可以使用递归实现,新链表也不需要构造新节点,我们下面列举递归三个要素终止条件:两条链表分别名为 l1 和 l2,当 l1 为空或 l2 为空时结束返回值:每一层调用都返回排序好的链表头本级递归内容:如果 l1 的 val 值更小,则将 l1.ne原创 2020-08-22 22:49:03 · 143 阅读 · 0 评论 -
算法--外观数列
描述给定一个正整数 n(1 ≤ n ≤ 30),输出外观数列的第 n 项。注意:整数序列中的每一项将表示为一个字符串。「外观数列」是一个整数序列,从数字 1 开始,序列中的每一项都是对前一项的描述。前五项如下:111211211111221说明:第一项是数字 1描述前一项,这个数是 1 即 “一个 1 ”,记作 11描述前一项,这个数是 11 即 “两个 1 ” ,记作 21描述前一项,这个数是 21 即 “一个 2 一个 1 ” ,记作 1211原创 2020-08-21 20:41:40 · 181 阅读 · 0 评论 -
算法--有效的括号
描述给定一个只包括 ‘(’,’)’,’{’,’}’,’[’,’]’ 的字符串,判断字符串是否有效。有效字符串需满足:左括号必须用相同类型的右括号闭合。左括号必须以正确的顺序闭合。注意空字符串可被认为是有效字符串。示例示例 1:输入: “()”输出: true示例 2:输入: “()[]{}”输出: true示例 3:输入: “(]”输出: false示例 4:输入: “([)]”输出: false示例 5:输入: “{[]}”输出: true分析利用栈来实现原创 2020-08-20 18:40:30 · 177 阅读 · 0 评论 -
算法--正则表达式匹配
描述给你一个字符串 s 和一个字符规律 p,请你来实现一个支持 ‘.’ 和 ‘*’ 的正则表达式匹配。‘.’ 匹配任意单个字符‘*’ 匹配零个或多个前面的那一个元素所谓匹配,是要涵盖 整个 字符串 s的,而不是部分字符串。说明:s 可能为空,且只包含从 a-z 的小写字母。p 可能为空,且只包含从 a-z 的小写字母,以及字符 . 和 *。示例示例 1:输入: s = “aa” p = “a”输出: false 解释: “a” 无法匹配 “aa” 整个字符串。示例 2:输入:原创 2020-08-17 18:26:52 · 181 阅读 · 0 评论 -
算法--实现 strStr()
描述实现 strStr() 函数。给定一个 haystack 字符串和一个 needle 字符串,在 haystack 字符串中找出 needle 字符串出现的第一个位置 (从0开始)。如果不存在,则返回 -1。示例示例 1: 输入: haystack = “hello”, needle = “ll”输出: 2示例 2: 输入: haystack = “aaaaa”, needle = “bba”输出: -1说明:当 needle 是空字符串时,我们应当返回什么值呢?这是一个在面试中很原创 2020-08-16 19:00:59 · 156 阅读 · 0 评论 -
算法--字符串转整数
描述请你来实现一个 atoi 函数,使其能将字符串转换成整数。首先,该函数会根据需要丢弃无用的开头空格字符,直到寻找到第一个非空格的字符为止。接下来的转化规则如下:如果第一个非空字符为正或者负号时,则将该符号与之后面尽可能多的连续数字字符组合起来,形成一个有符号整数。假如第一个非空字符是数字,则直接将其与之后连续的数字字符组合起来,形成一个整数。该字符串在有效的整数部分之后也可能会存在多余的字符,那么这些字符可以被忽略,它们对函数不应该造成影响。注意:假如该字符串中的第一个非空格字符不是一个有效原创 2020-08-13 19:32:12 · 152 阅读 · 0 评论 -
算法--回文数
描述判断一个整数是否是回文数。回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。示例示例 1: 输入: 121 输出: true示例 2: 输入: -121 输出: false解释: 从左向右读, 为 -121 。 从右向左读, 为 121-。因此它不是一个回文数。示例 3: 输入: 10 输出: false解释: 从右向左读, 为 01 。因此它不是一个回文数。分析1.判断是否是0和负数开始,直接排除2.通过取整和取余操作获取整数中对应的数字进行比较。简单实现pub原创 2020-08-12 19:10:56 · 204 阅读 · 0 评论 -
算法--Z 字形变换
描述将一个给定字符串根据给定的行数,以从上往下、从左到右进行 Z 字形排列。比如输入字符串为 “LEETCODEISHIRING” 行数为 3 时,排列如下:之后,你的输出需要从左往右逐行读取,产生出一个新的字符串,比如:“LCIRETOESIIGEDHN”。请你实现这个将字符串进行指定行数变换的函数:string convert(string s, int numRows);来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/zigzag原创 2020-08-10 18:38:39 · 140 阅读 · 0 评论 -
算法--最长回文子串
描述给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 的最大长度为 1000。回文串的定义:正着和反着读一样,那我们是不是把原来的字符串倒置了,然后找最长的公共子串就可以了。例如 S = “caba” ,S = “abac”,最长公共子串是 “aba”,所以原字符串的最长回文串就是 “aba”。作者:windliang链接:https://leetcode-cn.com/problems/longest-palindromic-substring/solution/xiang-xi-t原创 2020-08-08 17:29:28 · 285 阅读 · 0 评论 -
算法--无重复字符的最长子串
描述给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。示例示例 1: 输入: “abcabcbb” 输出: 3 解释: 因为无重复字符的最长子串是 “abc”,所以其长度为 3。示例 2: 输入: “bbbbb” 输出: 1 解释: 因为无重复字符的最长子串是 “b”,所以其长度为 1。示例 3: 输入: “pwwkew” 输出: 3解释: 因为无重复字符的最长子串是 “wke”,所以其长度为 3。 请注意,你的答案必须是子串 的长度,“pwke” 是一个子序列,不是子串。原创 2020-08-07 18:03:49 · 195 阅读 · 0 评论 -
算法--在排序数组中查找元素的第一个和最后一个位置
描述给定一个按照升序排列的整数数组 nums,和一个目标值 target。找出给定目标值在数组中的开始位置和结束位置。你的算法时间复杂度必须是 O(log n) 级别。如果数组中不存在目标值,返回 [-1, -1]。示例示例 1: 输入: nums = [5,7,7,8,8,10], target = 8 输出: [3,4]示例 2: 输入: nums = [5,7,7,8,8,10], target = 6 输出: [-1,-1]来源:力扣(LeetCode)链接:https://le原创 2020-08-05 21:04:25 · 226 阅读 · 0 评论 -
算法--搜索插入位置
描述给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。你可以假设数组中无重复元素。示例示例 1: 输入: [1,3,5,6], 5 输出: 2示例 2: 输入: [1,3,5,6], 2 输出: 1示例 3: 输入: [1,3,5,6], 7 输出: 4示例 4: 输入: [1,3,5,6], 0 输出: 0来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/sear原创 2020-08-04 21:39:11 · 157 阅读 · 0 评论 -
算法--下一个排列
描述实现获取下一个排列的函数,算法需要将给定数字序列重新排列成字典序中下一个更大的排列。如果不存在下一个更大的排列,则将数字重新排列成最小的排列(即升序排列)。必须原地修改,只允许使用额外常数空间。示例以下是一些例子,输入位于左侧列,其相应输出位于右侧列。1,2,3 → 1,3,23,2,1 → 1,2,31,1,5 → 1,5,1来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/next-permutation著作权归领扣网络所有。原创 2020-08-03 18:19:07 · 191 阅读 · 0 评论 -
算法--搜索旋转排序数组
描述假设按照升序排序的数组在预先未知的某个点上进行了旋转。( 例如,数组 [0,1,2,4,5,6,7] 可能变为 [4,5,6,7,0,1,2] )。搜索一个给定的目标值,如果数组中存在这个目标值,则返回它的索引,否则返回 -1 。可以假设数组中不存在重复的元素。你的算法时间复杂度必须是 O(log n) 级别。示例示例 1: 输入: nums = [4,5,6,7,0,1,2], target = 0 输出: 4示例 2: 输入: nums = [4,5,6,7,0,1,2], tar原创 2020-08-02 18:57:34 · 244 阅读 · 0 评论 -
算法--移除元素
描述给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度。不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并 原地 修改输入数组。元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。示例示例 1:给定 nums = [3,2,2,3], val = 3,函数应该返回新的长度 2, 并且 nums 中的前两个元素均为 2。你不需要考虑数组中超出新长度后面的元素。示例 2:给定 nums = [0,1,2,2,3,原创 2020-08-01 21:58:29 · 190 阅读 · 0 评论 -
算法--删除排序数组中的重复项
描述给定一个排序数组,你需要在 原地 删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度。不要使用额外的数组空间,你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下完成。示例示例 1:给定数组 nums = [1,1,2],函数应该返回新的长度 2, 并且原数组 nums 的前两个元素被修改为 1, 2。你不需要考虑数组中超出新长度后面的元素。示例 2:给定 nums = [0,0,1,1,1,2,2,3,3,4],函数应该返回新的长度 5, 并且原数组原创 2020-07-31 22:16:50 · 209 阅读 · 0 评论 -
算法--最接近的三数之和
描述给定一个包括 n 个整数的数组 nums 和 一个目标值 target。找出 nums 中的三个整数,使得它们的和与 target 最接近。返回这三个数的和。假定每组输入只存在唯一答案。示例输入:nums = [-1,2,1,-4], target = 1输出:2解释:与 target 最接近的和是 2 (-1 + 2 + 1 = 2) 。来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/3sum-closest著作权归领扣网络所有。商原创 2020-07-30 21:31:14 · 349 阅读 · 0 评论 -
算法--三数之和
描述给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?请你找出所有满足条件且不重复的三元组。注意:答案中不可以包含重复的三元组。示例给定数组 nums = [-1, 0, 1, 2, -1, -4],满足要求的三元组集合为:[[-1, 0, 1],[-1, -1, 2]]来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/3sum著作权归领扣网络所有。商业转原创 2020-07-29 18:35:22 · 581 阅读 · 0 评论 -
算法--盛最多水的容器
描述给你 n 个非负整数 a1,a2,…,an,每个数代表坐标中的一个点 (i, ai) 。在坐标内画 n 条垂直线,垂直线 i 的两个端点分别为 (i, ai) 和 (i, 0)。找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。说明:你不能倾斜容器,且 n 的值至少为 2。来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/container-with-most-water著作权归领扣网络所有。商业转载请联系官方授权,非商业转原创 2020-07-28 16:53:58 · 165 阅读 · 0 评论 -
算法--排序数组中位数
描述给定两个大小为 m 和 n 的正序(从小到大)数组 nums1 和 nums2。请你找出这两个正序数组的中位数,并且要求算法的时间复杂度为 O(log(m + n))。你可以假设 nums1 和 nums2 不会同时为空。示例 1:nums1 = [1, 3]nums2 = [2]则中位数是 2.0示例 2:nums1 = [1, 2]nums2 = [3, 4]则中位数是 (2 + 3)/2 = 2.5来源:力扣(LeetCode)链接:https://leetcode-cn原创 2020-07-27 16:27:18 · 737 阅读 · 0 评论 -
算法--两数之和
描述给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个整数,并返回他们的数组下标。你可以假设每种输入只会对应一个答案。但是,数组中同一个元素不能使用两遍。示例:给定 nums = [2, 7, 11, 15], target = 9因为 nums[0] + nums[1] = 2 + 7 = 9所以返回 [0, 1]来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/two-sum著作权归领扣网络原创 2020-07-26 11:30:51 · 151 阅读 · 0 评论