每日算法
刷LeetCode总结出来的笔记,几乎每天都会更新,觉得有用的不妨点个关注,多谢捧场。
偏偏爱吃梨
这个作者很懒,什么都没留下…
展开
-
每日算法-N 叉树的后序遍历
题目给定一个 N 叉树,返回其节点值的 后序遍历 。N 叉树 在输入中按层序遍历进行序列化表示,每组子节点由空值 null 分隔(请参见示例)。进阶:递归法很简单,你可以使用迭代法完成此题吗?示例 1:输入:root = [1,null,3,2,4,null,5,6]输出:[5,6,3,2,4,1]示例 2:输入:root = [1,null,2,3,4,5,null,null,6,7,null,8,null,9,10,null,null,11,null,12,null,13,nul原创 2021-04-12 20:26:42 · 342 阅读 · 0 评论 -
每日算法-N 叉树的前序遍历
题目给定一个 N 叉树,返回其节点值的 前序遍历 。N 叉树 在输入中按层序遍历进行序列化表示,每组子节点由空值 null 分隔(请参见示例)。进阶:递归法很简单,你可以使用迭代法完成此题吗?示例 1:输入:root = [1,null,3,2,4,null,5,6]输出:[1,3,5,6,2,4]示例 2:输入:root = [1,null,2,3,4,5,null,null,6,7,null,8,null,9,10,null,null,11,null,12,null,13,nul原创 2021-04-12 20:25:36 · 275 阅读 · 0 评论 -
排序
1, 冒泡排序冒泡排序算法的运作如下:比较两个相邻的数,如果前面的数大于后面的数,则将这两个数交换位置。第一次遍历后,最大的数会被放到数组的最后位置,即array[length - 1]。第二次遍历时跳过最后一个元素,因为该元素通过第一次遍历已经确定是最大值。持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。代码:public static void bubbleSort(int[] array) { if (array == null || array.len原创 2021-04-03 10:33:35 · 274 阅读 · 0 评论 -
每日算法-最长回文串
题目给定一个包含大写字母和小写字母的字符串,找到通过这些字母构造成的最长的回文串。在构造过程中,请注意区分大小写。比如 "Aa" 不能当做一个回文字符串。注意:假设字符串的长度不会超过 1010。示例 1:输入:"abccccdd"输出:7解释:我们可以构造的最长的回文串是"dccaccd", 它的长度是 7。解法class Solution { public int longestPalindrome(String s) { int result =原创 2021-03-23 18:14:29 · 138 阅读 · 0 评论 -
每日算法-数字转换为十六进制
题目给定一个整数,编写一个算法将这个数转换为十六进制数。对于负整数,我们通常使用 补码运算 方法。注意:十六进制中所有字母(a-f)都必须是小写。十六进制字符串中不能包含多余的前导零。如果要转化的数为0,那么以单个字符'0'来表示;对于其他情况,十六进制字符串中的第一个字符将不会是0字符。给定的数确保在32位有符号整数范围内。不能使用任何由库提供的将数字直接转换或格式化为十六进制的方法。示例 1:输入:26输出:"1a"示例 2:输入:-1输出:"ffffffff"原创 2021-03-23 18:13:27 · 2535 阅读 · 0 评论 -
每日算法-找不同
题目给定两个字符串 s 和 t,它们只包含小写字母。字符串 t 由字符串 s 随机重排,然后在随机位置添加一个字母。请找出在 t 中被添加的字母。示例 1:输入:s = "abcd", t = "abcde"输出:"e"解释:'e' 是那个被添加的字母。示例 2:输入:s = "", t = "y"输出:"y"示例 3:输入:s = "a", t = "aa"输出:"a"示例 4:输入:s = "ae", t = "aea"输出:"a"提示:0 <= s.原创 2021-03-19 10:39:38 · 304 阅读 · 0 评论 -
每日算法-字符串的第一个唯一字符
题目给定一个字符串,找到它的第一个不重复的字符,并返回它的索引。如果不存在,则返回 -1。示例:s = "leetcode"返回 0s = "loveleetcode"返回 2提示: 你可以假定该字符串只包含小写字母。解法思路一: 判断前后子串是否有当前字符,不再赘述。class Solution { // 判断前后子串是否有当前字符 public int firstUniqChar(String s) { if(s == null || s ==原创 2021-03-19 10:21:05 · 146 阅读 · 0 评论 -
每日算法-有效的完全平方数
题目给定一个 正整数 num ,编写一个函数,如果 num 是一个完全平方数,则返回 true ,否则返回 false 。进阶:不要 使用任何内置的库函数,如 sqrt 。示例 1:输入:num = 16输出:true示例 2:输入:num = 14输出:false提示:1 <= num <= 2^31 - 1解法思路: 二分查找,具体细节看代码注释。class Solution { // 二分查找 public boolean isPerfe原创 2021-03-19 10:16:26 · 206 阅读 · 0 评论 -
每日算法-两个数组的交集 II
题目给定两个数组,编写一个函数来计算它们的交集。示例 1:输入:nums1 = [1,2,2,1], nums2 = [2,2]输出:[2,2]示例 2:输入:nums1 = [4,9,5], nums2 = [9,4,9,8,4]输出:[4,9]说明:输出结果中每个元素出现的次数,应与元素在两个数组中出现次数的最小值一致。我们可以不考虑输出结果的顺序。进阶:如果给定的数组已经排好序呢?你将如何优化你的算法?如果 nums1 的大小比 nums2 小很多,哪种方法更优?原创 2021-03-15 19:43:20 · 189 阅读 · 0 评论 -
每日算法-两个数组的交集
题目给定两个数组,编写一个函数来计算它们的交集。示例 1:输入:nums1 = [1,2,2,1], nums2 = [2,2]输出:[2]示例 2:输入:nums1 = [4,9,5], nums2 = [9,4,9,8,4]输出:[9,4]说明:输出结果中的每个元素一定是唯一的。我们可以不考虑输出结果的顺序。解法解法一: 遍历数组,把目标数组放进Set中,再做判断。class Solution { /** 方法一:遍历数组,把目标数组放进Set原创 2021-03-15 19:42:15 · 153 阅读 · 0 评论 -
每日算法-4的幂
题目给定一个整数,写一个函数来判断它是否是 4 的幂次方。如果是,返回 true ;否则,返回 false 。整数 n 是 4 的幂次方需满足:存在整数 x 使得 n == 4x示例 1:输入:n = 16输出:true示例 2:输入:n = 5输出:false示例 3:输入:n = 1输出:true提示:-231 <= n <= 231 - 1解法方法一: 循环。class Solution { // 循环 public boolean原创 2021-03-12 17:17:33 · 380 阅读 · 0 评论 -
每日算法-单词规律
题目给定一种规律 pattern 和一个字符串 str ,判断 str 是否遵循相同的规律。这里的 遵循 指完全匹配,例如, pattern 里的每个字母和字符串 str 中的每个非空单词之间存在着双向连接的对应规律。示例1:输入: pattern = "abba", str = "dog cat cat dog"输出: true示例 2:输入:pattern = "abba", str = "dog cat cat fish"输出: false示例 3:输入: pattern =原创 2021-03-12 14:17:15 · 292 阅读 · 0 评论 -
每日算法-丢失的数字
题目给定一个包含 [0, n] 中 n 个数的数组 nums ,找出 [0, n] 这个范围内没有出现在数组中的那个数。进阶:你能否实现线性时间复杂度、仅使用额外常数空间的算法解决此问题?示例 1:输入:nums = [3,0,1]输出:2解释:n = 3,因为有 3 个数字,所以所有的数字都在范围 [0,3] 内。2 是丢失的数字,因为它没有出现在 nums 中。示例 2:输入:nums = [0,1]输出:2解释:n = 2,因为有 2 个数字,所以所有的数字都在范围 [0,原创 2021-03-11 19:48:41 · 216 阅读 · 0 评论 -
每日算法-二叉树的所有路径
题目给定一个二叉树,返回所有从根节点到叶子节点的路径。说明: 叶子节点是指没有子节点的节点。示例:输入: 1 / \2 3 \ 5输出: ["1->2->5", "1->3"]解释: 所有根节点到叶子节点的路径为: 1->2->5, 1->3解法思路: 递归,具体细节看代码中注释。/** * Definition for a binary tree node. * public class TreeNode {原创 2021-03-11 13:22:03 · 146 阅读 · 0 评论 -
每日算法-有效的字母异位词
题目给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词。示例 1:输入: s = "anagram", t = "nagaram"输出: true示例 2:输入: s = "rat", t = "car"输出: false说明:你可以假设字符串只包含小写字母。进阶:如果输入字符串包含 unicode 字符怎么办?你能否调整你的解法来应对这种情况?解法思路: 先对两个字符串进行排序,然后再逐一比较。class Solution { publi原创 2021-03-11 11:38:04 · 112 阅读 · 0 评论 -
每日算法-回文链表
题目请判断一个链表是否为回文链表。示例 1:输入: 1->2输出: false示例 2:输入: 1->2->2->1输出: true进阶:你能否用 O(n) 时间复杂度和 O(1) 空间复杂度解决此题?解法思路一: 先把链表的值都存进list中,然后再判断list是否存在回文性质。/** * Definition for singly-linked list. * public class ListNode { * int val; *原创 2021-03-10 16:57:39 · 118 阅读 · 2 评论 -
每日算法-用栈实现队列
题目请你仅使用两个栈实现先入先出队列。队列应当支持一般队列支持的所有操作(push、pop、peek、empty):实现 MyQueue 类:void push(int x)将元素 x 推到队列的末尾int pop()从队列的开头移除并返回元素int peek()返回队列开头的元素boolean empty() 如果队列为空,返回 true ;否则,返回false说明:你只能使用标准的栈操作 —— 也就是只有 push to top, peek/pop from top, size,原创 2021-03-10 14:22:46 · 115 阅读 · 0 评论 -
每日算法-2的幂
题目给定一个整数,编写一个函数来判断它是否是 2 的幂次方。示例 1:输入: 1输出: true解释: 20 = 1示例 2:输入: 16输出: true解释: 24 = 16示例 3:输入: 218输出: false解法思路一: 二分查找法class Solution { /** 二分查找法 */ public boolean isPowerOfTwo(int n) { if(n <= 0){原创 2021-03-10 11:31:39 · 190 阅读 · 0 评论 -
每日算法-汇总区间
题目给定一个无重复元素的有序整数数组 nums 。返回 恰好覆盖数组中所有数字 的 最小有序 区间范围列表。也就是说,nums 的每个元素都恰好被某个区间范围所覆盖,并且不存在属于某个范围但不属于 nums 的数字 x 。列表中的每个区间范围 [a,b] 应该按如下格式输出:"a->b" ,如果 a != b"a" ,如果 a == b示例 1:输入:nums = [0,1,2,4,5,7]输出:["0->2","4->5","7"]解释:区间范围是:[0,2] -原创 2021-03-10 10:41:45 · 104 阅读 · 0 评论 -
每日算法-四数之和
题目给定一个包含 n 个整数的数组 nums 和一个目标值 target,判断 nums 中是否存在四个元素 a,b,c 和 d ,使得 a + b + c + d 的值与 target 相等?找出所有满足条件且不重复的四元组。注意: 答案中不可以包含重复的四元组。示例 1:输入:nums = [1,0,-1,0,-2,2], target = 0输出:[[-2,-1,1,2],[-2,0,0,2],[-1,0,0,1]]示例 2:输入:nums = [], target = 0输出:[]原创 2021-03-09 20:35:42 · 180 阅读 · 2 评论 -
每日算法-最接近的三数之和
题目给定一个包括 n 个整数的数组 nums 和 一个目标值 target。找出 nums 中的三个整数,使得它们的和与 target 最接近。返回这三个数的和。假定每组输入只存在唯一答案。示例:输入:nums = [-1,2,1,-4], target = 1输出:2解释:与 target 最接近的和是 2 (-1 + 2 + 1 = 2) 。提示:3 <= nums.length <= 10^3-10^3 <= nums[i] <= 10^3-10^4 &l原创 2021-03-09 14:11:57 · 196 阅读 · 0 评论 -
每日算法-三数之和
题目给你一个包含n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?请你找出所有和为 0 且不重复的三元组。注意: 答案中不可以包含重复的三元组。示例 1:输入:nums = [-1,0,1,2,-1,-4]输出:[[-1,-1,2],[-1,0,1]]示例 2:输入:nums = []输出:[]示例 3:输入:nums = [0]输出:[]提示:0 <= nums.length <= 3000-1原创 2021-03-08 17:27:53 · 156 阅读 · 1 评论 -
每日算法-用队列实现栈
题目请你仅使用两个队列实现一个后入先出(LIFO)的栈,并支持普通队列的全部四种操作(push、top、pop 和 empty)。实现 MyStack 类:void push(int x) 将元素 x 压入栈顶。int pop() 移除并返回栈顶元素。int top() 返回栈顶元素。boolean empty() 如果栈是空的,返回 true ;否则,返回 false 。注意:你只能使用队列的基本操作 —— 也就是 push to back、peek/pop from front原创 2021-03-08 16:39:43 · 151 阅读 · 0 评论 -
每日算法-存在重复元素 II
题目给定一个整数数组和一个整数 k,判断数组中是否存在两个不同的索引i 和 j,使得nums [i] = nums [j],并且 i 和j的差的 绝对值 至多为 k。示例 1:输入: nums = [1,2,3,1], k = 3输出: true示例 2:输入: nums = [1,0,1,1], k = 1输出: true示例 3:输入: nums = [1,2,3,1,2,3], k = 2输出: false解法思路: 哈希表。class Solution { p原创 2021-03-08 15:47:57 · 110 阅读 · 0 评论 -
每日算法-存在重复元素
题目给定一个整数数组,判断是否存在重复元素。如果存在一值在数组中出现至少两次,函数返回 true 。如果数组中每个元素都不相同,则返回 false 。示例 1:输入: [1,2,3,1]输出: true示例 2:输入: [1,2,3,4]输出: false示例 3:输入: [1,1,1,3,3,4,3,2,4,2]输出: true解法思路: 哈希表。class Solution { public boolean containsDuplicate(int[] num原创 2021-03-08 15:42:15 · 90 阅读 · 0 评论 -
每日算法-移除链表元素
题目给你一个链表的头节点 head 和一个整数 val ,请你删除链表中所有满足 Node.val == val 的节点,并返回 新的头节点 。示例 1:输入:head = [1,2,6,3,4,5,6], val = 6输出:[1,2,3,4,5]示例 2:输入:head = [], val = 1输出:[]示例 3:输入:head = [7,7,7,7], val = 7输出:[]提示:列表中的节点在范围 [0, 104] 内1 <= Node.val <原创 2021-03-08 15:37:36 · 154 阅读 · 1 评论 -
每日算法-位1的个数
题目编写一个函数,输入是一个无符号整数(以二进制串的形式),返回其二进制表达式中数字位数为 ‘1’ 的个数(也被称为汉明重量)。提示:请注意,在某些语言(如 Java)中,没有无符号整数类型。在这种情况下,输入和输出都将被指定为有符号整数类型,并且不应影响您的实现,因为无论整数是有符号的还是无符号的,其内部的二进制表示形式都是相同的。在 Java 中,编译器使用二进制补码记法来表示有符号整数。因此,在上面的 示例 3 中,输入表示有符号整数 -3。进阶:如果多次调用这个函数,你将如何优化你原创 2021-03-07 19:28:00 · 92 阅读 · 0 评论 -
每日算法-Excel表列序号
题目给定一个Excel表格中的列名称,返回其相应的列序号。例如,A -> 1B -> 2C -> 3...Z -> 26AA -> 27AB -> 28 ...示例 1:输入: "A"输出: 1示例 2:输入: "AB"输出: 28示例 3:输入: "ZY"输出: 701解法思路: 字符串遍历,进制转换。class Solution { public int titleToNumber(String s) {原创 2021-03-07 19:27:02 · 212 阅读 · 0 评论 -
每日算法-整数转罗马数字
题目罗马数字包含以下七种字符: I, V, X, L,C,D 和 M。字符 数值I 1V 5X 10L 50C 100D 500M 1000例如, 罗马数字 2 写做 II ,即为两个并列的 1。12 写做 XII ,即为 X + II 。 27 写做 XXVII, 即为 XX + V + II 。原创 2021-03-07 19:25:35 · 64 阅读 · 0 评论 -
每日算法-整数转罗马数字
题目罗马数字包含以下七种字符: I, V, X, L,C,D 和 M。字符 数值I 1V 5X 10L 50C 100D 500M 1000例如, 罗马数字 2 写做 II ,即为两个并列的 1。12 写做 XII ,即为 X + II 。 27 写做 XXVII, 即为 XX + V + II 。原创 2021-03-05 16:18:41 · 179 阅读 · 0 评论 -
每日算法-颠倒二进制位
题目颠倒给定的 32 位无符号整数的二进制位。示例 1:输入: 00000010100101000001111010011100输出: 00111001011110000010100101000000解释: 输入的二进制串 00000010100101000001111010011100 表示无符号整数 43261596, 因此返回 964176192,其二进制表示形式为 00111001011110000010100101000000。示例 2:输入:11111111111111原创 2021-03-05 15:37:51 · 147 阅读 · 0 评论 -
每日算法-盛最多水的容器
题目给你 n 个非负整数 a1,a2,...,an,每个数代表坐标中的一个点 (i, ai) 。在坐标内画 n 条垂直线,垂直线 i 的两个端点分别为 (i, ai)和 (i, 0) 。找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。说明: 你不能倾斜容器。示例 1:输入:[1,8,6,2,5,4,8,3,7]输出:49 解释:图中垂直线代表输入数组 [1,8,6,2,5,4,8,3,7]。在此情况下,容器能够容纳水(表示为蓝色部分)的最大值为 49。示例 2:输入:原创 2021-03-05 09:27:53 · 135 阅读 · 1 评论 -
每日算法-字符串转换整数 (atoi)
题目请你来实现一个 myAtoi(string s) 函数,使其能将字符串转换成一个 32 位有符号整数(类似 C/C++ 中的 atoi 函数)。函数 myAtoi(string s) 的算法如下:读入字符串并丢弃无用的前导空格检查下一个字符(假设还未到字符末尾)为正还是负号,读取该字符(如果有)。 确定最终结果是负数还是正数。 如果两者都不存在,则假定结果为正。读入下一个字符,直到到达下一个非数字字符或到达输入的结尾。字符串的其余部分将被忽略。将前面步骤读入的这些数字转换为整数(即,"12原创 2021-03-05 09:25:40 · 227 阅读 · 1 评论 -
每日算法-Z字形变换
题目将一个给定字符串 s 根据给定的行数 numRows ,以从上往下、从左到右进行 Z 字形排列。比如输入字符串为 "PAYPALISHIRING" 行数为 3 时,排列如下:P A H NA P L S I I GY I R之后,你的输出需要从左往右逐行读取,产生出一个新的字符串,比如:"PAHNAPLSIIGYIR"。请你实现这个将字符串进行指定行数变换的函数:string convert(string s, int numRows);示例 1:输入:s =原创 2021-03-04 16:17:24 · 132 阅读 · 1 评论 -
每日算法-多数元素
题目给定一个大小为 n 的数组,找到其中的多数元素。多数元素是指在数组中出现次数 大于 ⌊ n/2 ⌋ 的元素。你可以假设数组是非空的,并且给定的数组总是存在多数元素。示例 1:输入:[3,2,3]输出:3示例 2:输入:[2,2,1,1,1,2,2]输出:2进阶:尝试设计时间复杂度为 O(n)、空间复杂度为 O(1) 的算法解决此问题。解法思路一: 使用哈希表。class Solution { // 使用HashMap解决 public int major原创 2021-03-04 14:28:33 · 73 阅读 · 1 评论 -
每日算法-Excel表列名称
题目给定一个正整数,返回它在 Excel 表中相对应的列名称。例如,1 -> A2 -> B3 -> C...26 -> Z27 -> AA28 -> AB ...示例 1:输入: 1输出: "A"示例 2:输入: 28输出: "AB"示例 3:输入: 701输出: "ZY"解法思路一: 递归class Solution { // 递归 public String convertToTitle(int n原创 2021-03-04 14:27:03 · 177 阅读 · 1 评论 -
每日算法-两数之和 II - 输入有序数组
题目给定一个已按照 升序排列 的整数数组 numbers ,请你从数组中找出两个数满足相加之和等于目标数 target 。函数应该以长度为 2 的整数数组的形式返回这两个数的下标值。numbers 的下标 从 1 开始计数 ,所以答案数组应当满足 1 <= answer[0] < answer[1] <= numbers.length 。你可以假设每个输入只对应唯一的答案,而且你不可以重复使用相同的元素。示例 1:输入:numbers = [2,7,11,15], target原创 2021-03-04 14:20:16 · 92 阅读 · 1 评论 -
每日算法-相交链表
题目编写一个程序,找到两个单链表相交的起始节点。如下面的两个链表 :在节点 c1 开始相交。示例 1:输入:intersectVal = 8, listA = [4,1,8,4,5], listB = [5,0,1,8,4,5], skipA = 2, skipB = 3输出:Reference of the node with value = 8输入解释:相交节点的值为 8 (注意,如果两个链表相交则不能为 0)。从各自的表头开始算起,链表 A 为 [4,1,8,4,5],链表 B 为原创 2021-03-04 10:18:32 · 315 阅读 · 4 评论 -
每日算法-最小栈
题目设计一个支持 push ,pop ,top 操作,并能在常数时间内检索到最小元素的栈。push(x) —— 将元素 x 推入栈中。pop() —— 删除栈顶的元素。top() —— 获取栈顶元素。getMin() —— 检索栈中的最小元素。示例:输入:["MinStack","push","push","push","getMin","pop","top","getMin"][[],[-2],[0],[-3],[],[],[],[]]输出:[null,null,null,n原创 2021-03-03 19:34:52 · 93 阅读 · 1 评论 -
每日算法-环形链表
题目给定一个链表,判断链表中是否有环。如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。 如果 pos 是 -1,则在该链表中没有环。注意:pos 不作为参数进行传递,仅仅是为了标识链表的实际情况。如果链表中存在环,则返回 true 。 否则,返回 false 。进阶:你能用 O(1)(即,常量)内存解决此问题吗?示例 1:输入:head = [3,2,0,-原创 2021-03-03 17:33:59 · 145 阅读 · 2 评论